Compare commits
No commits in common. "main" and "master" have entirely different histories.
|
@ -1,21 +0,0 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
trim_trailing_whitespace = true
|
||||
charset = utf-8
|
||||
|
||||
[*.{html,css,js}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.json]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
3
.gitignore
vendored
|
@ -1,4 +1,3 @@
|
|||
public/
|
||||
static/
|
||||
node_modules/
|
||||
*.swp
|
||||
.awsclirc
|
||||
|
|
3
.webpull
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
npm install
|
||||
node render.js
|
|
@ -1,56 +0,0 @@
|
|||
steps:
|
||||
- name: HTML syntax check
|
||||
image: debian:12
|
||||
# Debian has tidy 5.6.0, which complains about the "loading" tag in img.
|
||||
# We need a more recent version for now.
|
||||
commands:
|
||||
- DEBIAN_FRONTEND=noninteractive apt update -qq
|
||||
- DEBIAN_FRONTEND=noninteractive apt install -qq -y wget
|
||||
- wget -q https://github.com/htacg/tidy-html5/releases/download/5.8.0/tidy-5.8.0-Linux-64bit.deb
|
||||
- echo "59e594312207234f5a17455683c13c6bc47a89cb7bf994d493acfffb591d9830 tidy-5.8.0-Linux-64bit.deb" | sha256sum -c
|
||||
- DEBIAN_FRONTEND=noninteractive apt install -qq -y ./tidy-5.8.0-Linux-64bit.deb
|
||||
- tidy -q -e --drop-empty-elements no static/index.html
|
||||
|
||||
- name: disable SEO indexing (on preprod only)
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
branch: preprod
|
||||
image: debian:12 # Same as previous step to not have to download 2 images, but it could be any linux
|
||||
commands:
|
||||
- '[ -f static/robots.txt ] && echo "Disallow: /*" >> static/robots.txt'
|
||||
|
||||
- name: upload (preprod)
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
branch: preprod
|
||||
image: plugins/s3
|
||||
settings:
|
||||
bucket: preprod-site
|
||||
endpoint: https://garage.deuxfleurs.fr
|
||||
region: garage
|
||||
access_key:
|
||||
from_secret: aws_access_key_id
|
||||
secret_key:
|
||||
from_secret: aws_secret_access_key
|
||||
source: static/**/*
|
||||
target: /
|
||||
strip_prefix: static/
|
||||
path_style: true
|
||||
|
||||
- name: upload (prod)
|
||||
when:
|
||||
- event: push
|
||||
branch: main
|
||||
image: plugins/s3
|
||||
settings:
|
||||
bucket: deuxfleurs.fr
|
||||
endpoint: https://garage.deuxfleurs.fr
|
||||
region: garage
|
||||
access_key:
|
||||
from_secret: aws_access_key_id
|
||||
secret_key:
|
||||
from_secret: aws_secret_access_key
|
||||
source: static/**/*
|
||||
target: /
|
||||
strip_prefix: static/
|
||||
path_style: true
|
614
LICENSE
Normal file
|
@ -0,0 +1,614 @@
|
|||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http s ://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for software
|
||||
and other kinds of works, specifically designed to ensure cooperation with
|
||||
the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed to take
|
||||
away your freedom to share and change the works. By contrast, our General
|
||||
Public Licenses are intended to guarantee your freedom to share and change
|
||||
all versions of a program--to make sure it remains free software for all its
|
||||
users.
|
||||
|
||||
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 them 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.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights with two
|
||||
steps: (1) assert copyright on the software, and (2) offer you this License
|
||||
which gives you legal permission to copy, distribute and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that improvements made
|
||||
in alternate versions of the program, if they receive widespread use, become
|
||||
available for other developers to incorporate. Many developers of free software
|
||||
are heartened and encouraged by the resulting cooperation. However, in the
|
||||
case of software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and letting
|
||||
the public access it on a server without ever releasing its source code to
|
||||
the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to ensure that,
|
||||
in such cases, the modified source code becomes available to the community.
|
||||
It requires the operator of a network server to provide the source code of
|
||||
the modified version running there to the users of that server. Therefore,
|
||||
public use of a modified version, on a publicly accessible server, gives the
|
||||
public access to the source code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and published by
|
||||
Affero, was designed to accomplish similar goals. This is a different license,
|
||||
not a version of the Affero GPL, but Affero has released a new version of
|
||||
the Affero GPL which permits relicensing under this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of works,
|
||||
such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this License.
|
||||
Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals
|
||||
or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work in
|
||||
a fashion requiring copyright permission, other than the making of an exact
|
||||
copy. The resulting work is called a "modified version" of the earlier work
|
||||
or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based on the
|
||||
Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without permission,
|
||||
would make you directly or secondarily liable for infringement under applicable
|
||||
copyright law, except executing it on a computer or modifying a private copy.
|
||||
Propagation includes copying, distribution (with or without modification),
|
||||
making available to the public, and in some countries other activities as
|
||||
well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other parties
|
||||
to make or receive copies. Mere interaction with a user through a computer
|
||||
network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices" to the
|
||||
extent that it includes a convenient and prominently visible feature that
|
||||
(1) displays an appropriate copyright notice, and (2) tells the user that
|
||||
there is no warranty for the work (except to the extent that warranties are
|
||||
provided), that licensees may convey the work under this License, and how
|
||||
to view a copy of this License. If the interface presents a list of user commands
|
||||
or options, such as a menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work for making
|
||||
modifications to it. "Object code" means any non-source form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official standard
|
||||
defined by a recognized standards body, or, in the case of interfaces specified
|
||||
for a particular programming language, one that is widely used among developers
|
||||
working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other than
|
||||
the work as a whole, that (a) is included in the normal form of packaging
|
||||
a Major Component, but which is not part of that Major Component, and (b)
|
||||
serves only to enable use of the work with that Major Component, or to implement
|
||||
a Standard Interface for which an implementation is available to the public
|
||||
in source code form. A "Major Component", in this context, means a major essential
|
||||
component (kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to produce
|
||||
the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all the source
|
||||
code needed to generate, install, and (for an executable work) run the object
|
||||
code and to modify the work, including scripts to control those activities.
|
||||
However, it does not include the work's System Libraries, or general-purpose
|
||||
tools or generally available free programs which are used unmodified in performing
|
||||
those activities but which are not part of the work. For example, Corresponding
|
||||
Source includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically linked
|
||||
subprograms that the work is specifically designed to require, such as by
|
||||
intimate data communication or control flow between those
|
||||
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users can regenerate
|
||||
automatically from other parts of the Corresponding Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of copyright
|
||||
on the Program, and are irrevocable provided the stated conditions are met.
|
||||
This License explicitly affirms your unlimited permission to run the unmodified
|
||||
Program. The output from running a covered work is covered by this License
|
||||
only if the output, given its content, constitutes a covered work. This License
|
||||
acknowledges your rights of fair use or other equivalent, as provided by copyright
|
||||
law.
|
||||
|
||||
You may make, run and propagate covered works that you do not convey, without
|
||||
conditions so long as your license otherwise remains in force. You may convey
|
||||
covered works to others for the sole purpose of having them make modifications
|
||||
exclusively for you, or provide you with facilities for running those works,
|
||||
provided that you comply with the terms of this License in conveying all material
|
||||
for which you do not control copyright. Those thus making or running the covered
|
||||
works for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of your copyrighted
|
||||
material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under the conditions
|
||||
stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological measure
|
||||
under any applicable law fulfilling obligations under article 11 of the WIPO
|
||||
copyright treaty adopted on 20 December 1996, or similar laws prohibiting
|
||||
or restricting circumvention of such measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid circumvention
|
||||
of technological measures to the extent such circumvention is effected by
|
||||
exercising rights under this License with respect to the covered work, and
|
||||
you disclaim any intention to limit operation or modification of the work
|
||||
as a means of enforcing, against the work's users, your or third parties'
|
||||
legal rights to forbid circumvention of technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey 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; keep intact all notices stating
|
||||
that this License and any non-permissive terms added in accord with section
|
||||
7 apply to the code; keep intact all notices of the absence of any warranty;
|
||||
and give all recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey, and you
|
||||
may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to produce
|
||||
it from the Program, in the form of source code under the terms of section
|
||||
4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified it, and
|
||||
giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is released under
|
||||
this License and any conditions added under section 7. This requirement modifies
|
||||
the requirement in section 4 to "keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this License to anyone
|
||||
who comes into possession of a copy. This License will therefore apply, along
|
||||
with any applicable section 7 additional terms, to the whole of the work,
|
||||
and all its parts, regardless of how they are packaged. This License gives
|
||||
no permission to license the work in any other way, but it does not invalidate
|
||||
such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display Appropriate
|
||||
Legal Notices; however, if the Program has interactive interfaces that do
|
||||
not display Appropriate Legal Notices, your work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent works,
|
||||
which are not by their nature extensions of the covered work, and which are
|
||||
not combined with it such as to form a larger program, in or on a volume of
|
||||
a storage or distribution medium, is called an "aggregate" if the compilation
|
||||
and its resulting copyright are not used to limit the access or legal rights
|
||||
of the compilation's users beyond what the individual works permit. Inclusion
|
||||
of a covered work in an aggregate does not cause this License to apply to
|
||||
the other parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms of sections
|
||||
4 and 5, provided that you also convey the machine-readable Corresponding
|
||||
Source under the terms of this License, in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product (including
|
||||
a physical distribution medium), accompanied by the Corresponding Source fixed
|
||||
on a durable physical medium customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product (including
|
||||
a physical distribution medium), accompanied by a written offer, valid for
|
||||
at least three years and valid for as long as you offer spare parts or customer
|
||||
support for that product model, to give anyone who possesses the object code
|
||||
either (1) a copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical medium customarily
|
||||
used for software interchange, for a price no more than your reasonable cost
|
||||
of physically performing this conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the written
|
||||
offer to provide the Corresponding Source. This alternative is allowed only
|
||||
occasionally and noncommercially, and only if you received the object code
|
||||
with such an offer, in accord with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated place (gratis
|
||||
or for a charge), and offer equivalent access to the Corresponding Source
|
||||
in the same way through the same place at no further charge. You need not
|
||||
require recipients to copy the Corresponding Source along with the object
|
||||
code. If the place to copy the object code is a network server, the Corresponding
|
||||
Source may be on a different server (operated by you or a third party) that
|
||||
supports equivalent copying facilities, provided you maintain clear directions
|
||||
next to the object code saying where to find the Corresponding Source. Regardless
|
||||
of what server hosts the Corresponding Source, you remain obligated to ensure
|
||||
that it is available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided you inform
|
||||
other peers where the object code and Corresponding Source of the work are
|
||||
being offered to the general public at no charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded from
|
||||
the Corresponding Source as a System Library, need not be included in conveying
|
||||
the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any tangible
|
||||
personal property which is normally used for personal, family, or household
|
||||
purposes, or (2) anything designed or sold for incorporation into a dwelling.
|
||||
In determining whether a product is a consumer product, doubtful cases shall
|
||||
be resolved in favor of coverage. For a particular product received by a particular
|
||||
user, "normally used" refers to a typical or common use of that class of product,
|
||||
regardless of the status of the particular user or of the way in which the
|
||||
particular user actually uses, or expects or is expected to use, the product.
|
||||
A product is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent the
|
||||
only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods, procedures,
|
||||
authorization keys, or other information required to install and execute modified
|
||||
versions of a covered work in that User Product from a modified version of
|
||||
its Corresponding Source. The information must suffice to ensure that the
|
||||
continued functioning of the modified object code is in no case prevented
|
||||
or interfered with solely because modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or specifically
|
||||
for use in, a User Product, and the conveying occurs as part of a transaction
|
||||
in which the right of possession and use of the User Product is transferred
|
||||
to the recipient in perpetuity or for a fixed term (regardless of how the
|
||||
transaction is characterized), the Corresponding Source conveyed under this
|
||||
section must be accompanied by the Installation Information. But this requirement
|
||||
does not apply if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has been installed
|
||||
in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a requirement
|
||||
to continue to provide support service, warranty, or updates for a work that
|
||||
has been modified or installed by the recipient, or for the User Product in
|
||||
which it has been modified or installed. Access to a network may be denied
|
||||
when the modification itself materially and adversely affects the operation
|
||||
of the network or violates the rules and protocols for communication across
|
||||
the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided, in accord
|
||||
with this section must be in a format that is publicly documented (and with
|
||||
an implementation available to the public in source code form), and must require
|
||||
no special password or key for unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this License
|
||||
by making exceptions from one or more of its conditions. Additional permissions
|
||||
that are applicable to the entire Program shall be treated as though they
|
||||
were included in this License, to the extent that they are valid under applicable
|
||||
law. If additional permissions apply only to part of the Program, that part
|
||||
may be used separately under those permissions, but the entire Program remains
|
||||
governed by this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option remove any
|
||||
additional permissions from that copy, or from any part of it. (Additional
|
||||
permissions may be written to require their own removal in certain cases when
|
||||
you modify the work.) You may place additional permissions on material, added
|
||||
by you to a covered work, for which you have or can give appropriate copyright
|
||||
permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you add
|
||||
to a covered work, you may (if authorized by the copyright holders of that
|
||||
material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the terms of
|
||||
sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or author
|
||||
attributions in that material or in the Appropriate Legal Notices displayed
|
||||
by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or requiring
|
||||
that modified versions of such material be marked in reasonable ways as different
|
||||
from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or authors
|
||||
of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some trade names,
|
||||
trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that material by
|
||||
anyone who conveys the material (or modified versions of it) with contractual
|
||||
assumptions of liability to the recipient, for any liability that these contractual
|
||||
assumptions directly impose on those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further restrictions"
|
||||
within the meaning of section 10. If the Program as you received it, or any
|
||||
part of it, contains a notice stating that it is governed by this License
|
||||
along with a term that is a further restriction, you may remove that term.
|
||||
If a license document contains a further restriction but permits relicensing
|
||||
or conveying under this License, you may add to a covered work material governed
|
||||
by the terms of that license document, provided that the further restriction
|
||||
does not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you must place,
|
||||
in the relevant source files, a statement of the additional terms that apply
|
||||
to those files, or a notice indicating where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the form
|
||||
of a separately written license, or stated as exceptions; the above requirements
|
||||
apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly provided
|
||||
under this License. Any attempt otherwise to propagate or modify it is void,
|
||||
and will automatically terminate your rights under this License (including
|
||||
any patent licenses granted under the third paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your license from
|
||||
a particular copyright holder is reinstated (a) provisionally, unless and
|
||||
until the copyright holder explicitly and finally terminates your license,
|
||||
and (b) permanently, if the copyright holder fails to notify you of the violation
|
||||
by some reasonable means prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is reinstated permanently
|
||||
if the copyright holder notifies you of the violation by some reasonable means,
|
||||
this is the first time you have received notice of violation of this License
|
||||
(for any work) from that copyright holder, and you cure the violation prior
|
||||
to 30 days after your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the licenses
|
||||
of parties who have received copies or rights from you under this License.
|
||||
If your rights have been terminated and not permanently reinstated, you do
|
||||
not qualify to receive new licenses for the same material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or run a copy
|
||||
of the Program. Ancillary propagation of a covered work occurring solely as
|
||||
a consequence of using peer-to-peer transmission to receive a copy likewise
|
||||
does not require acceptance. However, nothing other than this License grants
|
||||
you permission to propagate or modify any covered work. These actions infringe
|
||||
copyright if you do not accept this License. Therefore, by modifying or propagating
|
||||
a covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically receives
|
||||
a license from the original licensors, to run, modify and propagate that work,
|
||||
subject to this License. You are not responsible for enforcing compliance
|
||||
by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an organization,
|
||||
or substantially all assets of one, or subdividing an organization, or merging
|
||||
organizations. If propagation of a covered work results from an entity transaction,
|
||||
each party to that transaction who receives a copy of the work also receives
|
||||
whatever licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the Corresponding
|
||||
Source of the work from the predecessor in interest, if the predecessor has
|
||||
it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the rights
|
||||
granted or affirmed under this License. For example, you may not impose a
|
||||
license fee, royalty, or other charge for exercise of rights granted under
|
||||
this License, and you may not initiate litigation (including a cross-claim
|
||||
or counterclaim in a lawsuit) alleging that any patent claim is infringed
|
||||
by making, using, selling, offering for sale, or importing the Program or
|
||||
any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this License
|
||||
of the Program or a work on which the Program is based. The work thus licensed
|
||||
is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims owned or controlled
|
||||
by the contributor, whether already acquired or hereafter acquired, that would
|
||||
be infringed by some manner, permitted by this License, of making, using,
|
||||
or selling its contributor version, but do not include claims that would be
|
||||
infringed only as a consequence of further modification of the contributor
|
||||
version. For purposes of this definition, "control" includes the right to
|
||||
grant patent sublicenses in a manner consistent with the requirements of this
|
||||
License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free patent
|
||||
license under the contributor's essential patent claims, to make, use, sell,
|
||||
offer for sale, import and otherwise run, modify and propagate the contents
|
||||
of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express agreement
|
||||
or commitment, however denominated, not to enforce a patent (such as an express
|
||||
permission to practice a patent or covenant not to s ue for patent infringement).
|
||||
To "grant" such a patent license to a party means to make such an agreement
|
||||
or commitment not to enforce a patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license, and the
|
||||
Corresponding Source of the work is not available for anyone to copy, free
|
||||
of charge and under the terms of this License, through a publicly available
|
||||
network server or other readily accessible means, then you must either (1)
|
||||
cause the Corresponding Source to be so available, or (2) arrange to deprive
|
||||
yourself of the benefit of the patent license for this particular work, or
|
||||
(3) arrange, in a manner consistent with the requirements of this License,
|
||||
to extend the patent
|
||||
|
||||
license to downstream recipients. "Knowingly relying" means you have actual
|
||||
knowledge that, but for the patent license, your conveying the covered work
|
||||
in a country, or your recipient's use of the covered work in a country, would
|
||||
infringe one or more identifiable patents in that country that you have reason
|
||||
to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or arrangement,
|
||||
you convey, or propagate by procuring conveyance of, a covered work, and grant
|
||||
a patent license to some of the parties receiving the covered work authorizing
|
||||
them to use, propagate, modify or convey a specific copy of the covered work,
|
||||
then the patent license you grant is automatically extended to all recipients
|
||||
of the covered work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within the scope
|
||||
of its coverage, prohibits the exercise of, or is conditioned on the non-exercise
|
||||
of one or more of the rights that are specifically granted under this License.
|
||||
You may not convey a covered work if you are a party to an arrangement with
|
||||
a third party that is in the business of distributing software, under which
|
||||
you make payment to the third party based on the extent of your activity of
|
||||
conveying the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory patent
|
||||
license (a) in connection with copies of the covered work conveyed by you
|
||||
(or copies made from those copies), or (b) primarily for and in connection
|
||||
with specific products or compilations that contain the covered work, unless
|
||||
you entered into that arrangement, or that patent license was granted, prior
|
||||
to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting any implied
|
||||
license or other defenses to infringement that may otherwise be available
|
||||
to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If 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 convey a covered work so as
|
||||
to satisfy simultaneously your obligations under this License and any other
|
||||
pertinent obligations, then as a consequence you may
|
||||
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey the
|
||||
Program, the only way you could satisfy both those terms and this License
|
||||
would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the Program,
|
||||
your modified version must prominently offer all users interacting with it
|
||||
remotely through a computer network (if your version supports such interaction)
|
||||
an opportunity to receive the Corresponding Source of your version by providing
|
||||
access to the Corresponding Source from a network server at no charge, through
|
||||
some standard or customary means of facilitating copying of software. This
|
||||
Corresponding Source shall include the Corresponding Source for any work covered
|
||||
by version 3 of the GNU General Public License that is incorporated pursuant
|
||||
to the following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have permission to
|
||||
link or combine any covered work with a work licensed under version 3 of the
|
||||
GNU General Public License into a single combined work, and to convey the
|
||||
resulting work. The terms of this License will continue to apply to the part
|
||||
which is the covered work, but the work with which it is combined will remain
|
||||
governed by version 3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of the
|
||||
GNU Affero 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
|
||||
that a certain numbered version of the GNU Affero General Public License "or
|
||||
any later version" applies to it, you have the option of following the terms
|
||||
and conditions either of that numbered version or of any later version published
|
||||
by the Free Software Foundation. If the Program does not specify a version
|
||||
number of the GNU Affero General Public License, you may choose any version
|
||||
ever published by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future versions of
|
||||
the GNU Affero General Public License can be used, that proxy's public statement
|
||||
of acceptance of a version permanently authorizes you to choose that version
|
||||
for the Program.
|
||||
|
||||
Later license versions may give you additional or different permissions. However,
|
||||
no additional obligations are imposed on any author or copyright holder as
|
||||
a result of your choosing to follow a later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
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.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
|
||||
ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided above cannot
|
||||
be given local legal effect according to their terms, reviewing courts shall
|
||||
apply local law that most closely approximates an absolute waiver of all civil
|
||||
liability in connection with the Program, unless a warranty or assumption
|
||||
of liability accompanies a copy of the Program in return for a fee. 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 state 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 Affero General Public License as published by the Free
|
||||
Software Foundation, either version 3 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 Affero General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License along
|
||||
with this program. If not, see <http s ://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer network,
|
||||
you should also make sure that it provides a way for users to get its source.
|
||||
For example, if your program is a web application, its interface could display
|
||||
a "Source" link that leads users to an archive of the code. There are many
|
||||
ways you could offer source, and different solutions will be better for different
|
||||
programs; see section 13 for the specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary. For
|
||||
more information on this, and how to apply and follow the GNU AGPL, see <http
|
||||
s ://www.gnu.org/licenses/>.
|
104
README.md
|
@ -1,57 +1,69 @@
|
|||
# deuxfleurs.fr - site web
|
||||
# site
|
||||
|
||||
Le site web en ASCII Art de Deuxfleurs
|
||||
Ce dépôt git contient les sources pour le site [deuxfleurs.fr](https://deuxfleurs.fr/).
|
||||
C'est ici que vous pourrez apporter des modifications au site.
|
||||
|
||||
## Comment ajouter du contenu ?
|
||||
|
||||
Prérequis :
|
||||
- Un compte sur cette instance gitea.
|
||||
- Le logiciel git d'installé. [téléchager](https://git-scm.com/downloads).
|
||||
|
||||
Pour commencer, assurez-vous d'être connecté.
|
||||
Ensuite cliquez sur le bouton "Bifurcation" en haut à droite (*fork* en anglais).
|
||||
Finalement, vous pourrez cloner votre dépôt en local :
|
||||
|
||||
```
|
||||
'\ ; /'
|
||||
·`.;.;.`·
|
||||
·— · · —·
|
||||
·`';.;'`·
|
||||
'/ ; \'
|
||||
.-.
|
||||
.( ; ;
|
||||
.-. (_.():')
|
||||
_( ' ; /(' ; .)
|
||||
( `(·)` ; ``-'
|
||||
',_' `·,'
|
||||
`-`\| +---------------------+
|
||||
. /) | B i e n v e n u e |
|
||||
(\|/ +---------------------+
|
||||
| | |
|
||||
.,.,\/,}\|//,,, ;/,,\/ | , \,,,;/. ;.;, |,,,,;,;..
|
||||
|
||||
git clone https://git.deuxfleurs.fr/<votre nom d'utilisateur>/site.git
|
||||
```
|
||||
|
||||
Fabriquons un internet convivial ⤵
|
||||
```
|
||||
Pour ajouter du contenu, vous pouvez tout simplement ajouter un fichier dans le dossier `src`.
|
||||
Par exemple, le fichier `src/Association/Statuts.md` se retrouve à l'adresse `https://deuxfleurs.fr/Association/Statuts.html`.
|
||||
|
||||
## Structure
|
||||
Deux formats de fichiers différents sont supportés pour l'instant :
|
||||
|
||||
- `static` - Ce qui doit être envoyé sur le bucket
|
||||
- `r` - Pour faire un système de redirection minimaliste. Exemple: `deuxfleurs.fr/r/rdv23`
|
||||
- `.well-known` - Utilisé par Matrix, Thunderbird, chatons.org et d'autres pour la configuration automatique de pas mal de services
|
||||
- `img` le dossier qui contient les images
|
||||
- `res` - Ce qui peut être utile pour modifier le site web
|
||||
- `calendar.txt` - Tous les calendriers ASCII jusqu'à Décembre 2024
|
||||
- `.md` pour Markdown. [documentation](https://fr.wikipedia.org/wiki/Markdown). Rapide à apprendre, il est très pratique pour rajouter du contenu sans se poser la question de l'apparence.
|
||||
- `.pug` pour Pug. [documentation](https://pugjs.org). PugJS est une syntaxe différente pour représenter du HTML. Elle offre donc toute la souplesse de ce dernier et s'adapte plus à des mises en page complexe.
|
||||
|
||||
## Générateur de site statique ?
|
||||
Si vous ne savez pas par où commencer, choisissez markdown !
|
||||
N'hésitez pas à vous inspirer des fichiers existants.
|
||||
|
||||
Pas maintenant.
|
||||
|
||||
## Déployer en pré-production
|
||||
|
||||
Fait automatiquement via Woodpecker sur la branche `preprod`.
|
||||
|
||||
Le site en pré-production est ensuite accessible sur <https://preprod-site.web.deuxfleurs.fr/>
|
||||
|
||||
## Déployer en production
|
||||
|
||||
Fait automatiquement via Woodpecker sur la branche `main`.
|
||||
|
||||
## Déployer en production à la main (pas recommandé)
|
||||
|
||||
En cas de déploiement manuel : ⚠️ NE FAITES PAS `--delete` car il est fort probable
|
||||
que des trucs qui doivent rester dans le bucket ne sont pas copiés ici.
|
||||
Une fois vos modifications terminées, vous pouvez commit et push :
|
||||
|
||||
```
|
||||
aws s3 sync static/ s3://deuxfleurs.fr
|
||||
git add src/Association/MonFichier.md
|
||||
git commit -a
|
||||
git push
|
||||
```
|
||||
|
||||
Ensuite, vous pouvez créer une demande d'ajout (*pull request* ou *merge request* en anglais) depuis cette adresse (ou en cliquant sur l'onglet éponyme) : https://git.deuxfleurs.fr/Deuxfleurs/site/pulls
|
||||
|
||||
## Comment prévisualiser mes modifications ?
|
||||
|
||||
Prérequis :
|
||||
- nodejs et npm d'installé. [télécharger](https://nodejs.org/en/download/)
|
||||
|
||||
Vous pourriez vouloir vérifier que vos modifications rendent bien avant de faire votre demande d'ajout.
|
||||
Pour cela, nous utilisons un script de notre cru nommé `render.js`. Il convertit le dossier `src/` vers un site web contenu dans le dossier `static/` et peut, optionnellement, servir de serveur web.
|
||||
|
||||
La façon la plus simple de prévisualiser vos modifications est donc de :
|
||||
|
||||
```bash
|
||||
npm install # installer les dépendances
|
||||
LISTEN=3000 node render.js # effectuer le rendu puis démarrer un serveur web sur le port 3000
|
||||
```
|
||||
|
||||
Votre aperçu est alors disponible à cette URL : http://127.0.0.1:3000
|
||||
|
||||
À chaque modification, vous pouvez arrêter la dernière commande (CTRL+C) et la relancer pour forcer le rendu.
|
||||
|
||||
## Comment le site est mis à jour depuis ce dépôt ?
|
||||
|
||||
Tout est réalisé automatiquent, aucune intervention humaine n'est nécessaire.
|
||||
|
||||
Derrière les coulisses, une fois que votre demande d'ajout acceptée, elle arrive sur la branche `master` de ce dépôt.
|
||||
Cette opération déclenche automatiquement [un webhook gitea](https://docs.gitea.io/en-us/webhooks/) qui va alors effectuer une requete HTTP sur l'URL suivante : `https://deuxfleurs.fr/update?token=<redacted>`.
|
||||
Le serveur sait alors qu'il doit rafraichir le site web.
|
||||
Cette fonctionnalité est fournie par un petit outil qui s'appelle [webpull](https://git.deuxfleurs.fr/Deuxfleurs/deuxfleurs.fr/src/branch/master/docker/webpull).
|
||||
Ce dernier exécute alors deux commandes : `git pull` puis `./.webpull`.
|
||||
`.webpull` est en réalité un script bash contenu dans ce dépôt à la racine, dont vous pouvez inspecter le contenu.
|
||||
|
|
528
package-lock.json
generated
Normal file
|
@ -0,0 +1,528 @@
|
|||
{
|
||||
"name": "site",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@types/babel-types": {
|
||||
"version": "7.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz",
|
||||
"integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ=="
|
||||
},
|
||||
"@types/babylon": {
|
||||
"version": "6.16.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz",
|
||||
"integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==",
|
||||
"requires": {
|
||||
"@types/babel-types": "*"
|
||||
}
|
||||
},
|
||||
"acorn": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
|
||||
"integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
|
||||
},
|
||||
"acorn-globals": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
|
||||
"integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
|
||||
"requires": {
|
||||
"acorn": "^4.0.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"acorn": {
|
||||
"version": "4.0.13",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
|
||||
"integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
|
||||
}
|
||||
}
|
||||
},
|
||||
"align-text": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2",
|
||||
"longest": "^1.0.1",
|
||||
"repeat-string": "^1.5.2"
|
||||
}
|
||||
},
|
||||
"argparse": {
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
|
||||
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||
"requires": {
|
||||
"sprintf-js": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"asap": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
|
||||
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
|
||||
},
|
||||
"babel-runtime": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
|
||||
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
|
||||
"requires": {
|
||||
"core-js": "^2.4.0",
|
||||
"regenerator-runtime": "^0.11.0"
|
||||
}
|
||||
},
|
||||
"babel-types": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
|
||||
"integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
|
||||
"requires": {
|
||||
"babel-runtime": "^6.26.0",
|
||||
"esutils": "^2.0.2",
|
||||
"lodash": "^4.17.4",
|
||||
"to-fast-properties": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"babylon": {
|
||||
"version": "6.18.0",
|
||||
"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
|
||||
"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
|
||||
},
|
||||
"center-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
||||
"requires": {
|
||||
"align-text": "^0.1.3",
|
||||
"lazy-cache": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"character-parser": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
|
||||
"integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
|
||||
"requires": {
|
||||
"is-regex": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"clean-css": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
|
||||
"integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
|
||||
"requires": {
|
||||
"source-map": "~0.6.0"
|
||||
}
|
||||
},
|
||||
"cliui": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
|
||||
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
|
||||
"requires": {
|
||||
"center-align": "^0.1.1",
|
||||
"right-align": "^0.1.1",
|
||||
"wordwrap": "0.0.2"
|
||||
}
|
||||
},
|
||||
"constantinople": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
|
||||
"integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==",
|
||||
"requires": {
|
||||
"@types/babel-types": "^7.0.0",
|
||||
"@types/babylon": "^6.16.2",
|
||||
"babel-types": "^6.26.0",
|
||||
"babylon": "^6.18.0"
|
||||
}
|
||||
},
|
||||
"core-js": {
|
||||
"version": "2.6.11",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
|
||||
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
|
||||
},
|
||||
"decamelize": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
|
||||
},
|
||||
"doctypes": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
|
||||
"integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
|
||||
},
|
||||
"entities": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
|
||||
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
|
||||
},
|
||||
"esutils": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
|
||||
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
|
||||
},
|
||||
"function-bind": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
||||
},
|
||||
"has": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||
"requires": {
|
||||
"function-bind": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||
},
|
||||
"is-expression": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
|
||||
"integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
|
||||
"requires": {
|
||||
"acorn": "~4.0.2",
|
||||
"object-assign": "^4.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"acorn": {
|
||||
"version": "4.0.13",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
|
||||
"integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
|
||||
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
|
||||
},
|
||||
"is-regex": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
|
||||
"integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
|
||||
"requires": {
|
||||
"has": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"js-stringify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
|
||||
"integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
|
||||
},
|
||||
"jstransformer": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
|
||||
"integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
|
||||
"requires": {
|
||||
"is-promise": "^2.0.0",
|
||||
"promise": "^7.0.1"
|
||||
}
|
||||
},
|
||||
"jstransformer-markdown-it": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.1.0.tgz",
|
||||
"integrity": "sha1-aewwzkUYvtWZezjwJ2SOjChekvc=",
|
||||
"requires": {
|
||||
"markdown-it": "^8.0.0"
|
||||
}
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"requires": {
|
||||
"is-buffer": "^1.1.5"
|
||||
}
|
||||
},
|
||||
"lazy-cache": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
|
||||
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
|
||||
},
|
||||
"linkify-it": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
|
||||
"integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
|
||||
"requires": {
|
||||
"uc.micro": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.15",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
||||
},
|
||||
"longest": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
||||
},
|
||||
"markdown-it": {
|
||||
"version": "8.4.2",
|
||||
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
|
||||
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
|
||||
"requires": {
|
||||
"argparse": "^1.0.7",
|
||||
"entities": "~1.1.1",
|
||||
"linkify-it": "^2.0.0",
|
||||
"mdurl": "^1.0.1",
|
||||
"uc.micro": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"marked": {
|
||||
"version": "0.8.0",
|
||||
"resolved": "https://registry.npmjs.org/marked/-/marked-0.8.0.tgz",
|
||||
"integrity": "sha512-MyUe+T/Pw4TZufHkzAfDj6HarCBWia2y27/bhuYkTaiUnfDYFnCP3KUN+9oM7Wi6JA2rymtVYbQu3spE0GCmxQ=="
|
||||
},
|
||||
"mdurl": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
|
||||
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
|
||||
},
|
||||
"path-parse": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
|
||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
|
||||
},
|
||||
"promise": {
|
||||
"version": "7.3.1",
|
||||
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
|
||||
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
|
||||
"requires": {
|
||||
"asap": "~2.0.3"
|
||||
}
|
||||
},
|
||||
"pug": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz",
|
||||
"integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==",
|
||||
"requires": {
|
||||
"pug-code-gen": "^2.0.2",
|
||||
"pug-filters": "^3.1.1",
|
||||
"pug-lexer": "^4.1.0",
|
||||
"pug-linker": "^3.0.6",
|
||||
"pug-load": "^2.0.12",
|
||||
"pug-parser": "^5.0.1",
|
||||
"pug-runtime": "^2.0.5",
|
||||
"pug-strip-comments": "^1.0.4"
|
||||
}
|
||||
},
|
||||
"pug-attrs": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz",
|
||||
"integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==",
|
||||
"requires": {
|
||||
"constantinople": "^3.0.1",
|
||||
"js-stringify": "^1.0.1",
|
||||
"pug-runtime": "^2.0.5"
|
||||
}
|
||||
},
|
||||
"pug-code-gen": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz",
|
||||
"integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==",
|
||||
"requires": {
|
||||
"constantinople": "^3.1.2",
|
||||
"doctypes": "^1.1.0",
|
||||
"js-stringify": "^1.0.1",
|
||||
"pug-attrs": "^2.0.4",
|
||||
"pug-error": "^1.3.3",
|
||||
"pug-runtime": "^2.0.5",
|
||||
"void-elements": "^2.0.1",
|
||||
"with": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"pug-error": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz",
|
||||
"integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ=="
|
||||
},
|
||||
"pug-filters": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz",
|
||||
"integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==",
|
||||
"requires": {
|
||||
"clean-css": "^4.1.11",
|
||||
"constantinople": "^3.0.1",
|
||||
"jstransformer": "1.0.0",
|
||||
"pug-error": "^1.3.3",
|
||||
"pug-walk": "^1.1.8",
|
||||
"resolve": "^1.1.6",
|
||||
"uglify-js": "^2.6.1"
|
||||
}
|
||||
},
|
||||
"pug-lexer": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz",
|
||||
"integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==",
|
||||
"requires": {
|
||||
"character-parser": "^2.1.1",
|
||||
"is-expression": "^3.0.0",
|
||||
"pug-error": "^1.3.3"
|
||||
}
|
||||
},
|
||||
"pug-linker": {
|
||||
"version": "3.0.6",
|
||||
"resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz",
|
||||
"integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==",
|
||||
"requires": {
|
||||
"pug-error": "^1.3.3",
|
||||
"pug-walk": "^1.1.8"
|
||||
}
|
||||
},
|
||||
"pug-load": {
|
||||
"version": "2.0.12",
|
||||
"resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz",
|
||||
"integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==",
|
||||
"requires": {
|
||||
"object-assign": "^4.1.0",
|
||||
"pug-walk": "^1.1.8"
|
||||
}
|
||||
},
|
||||
"pug-parser": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz",
|
||||
"integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==",
|
||||
"requires": {
|
||||
"pug-error": "^1.3.3",
|
||||
"token-stream": "0.0.1"
|
||||
}
|
||||
},
|
||||
"pug-runtime": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz",
|
||||
"integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw=="
|
||||
},
|
||||
"pug-strip-comments": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz",
|
||||
"integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==",
|
||||
"requires": {
|
||||
"pug-error": "^1.3.3"
|
||||
}
|
||||
},
|
||||
"pug-walk": {
|
||||
"version": "1.1.8",
|
||||
"resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz",
|
||||
"integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA=="
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.11.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
|
||||
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
|
||||
},
|
||||
"repeat-string": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
||||
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.15.1",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
|
||||
"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
|
||||
"requires": {
|
||||
"path-parse": "^1.0.6"
|
||||
}
|
||||
},
|
||||
"right-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
|
||||
"requires": {
|
||||
"align-text": "^0.1.1"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
|
||||
},
|
||||
"sprintf-js": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
|
||||
},
|
||||
"to-fast-properties": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
|
||||
"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
|
||||
},
|
||||
"token-stream": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
|
||||
"integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
|
||||
},
|
||||
"uc.micro": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
|
||||
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "2.8.29",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
|
||||
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
|
||||
"requires": {
|
||||
"source-map": "~0.5.1",
|
||||
"uglify-to-browserify": "~1.0.0",
|
||||
"yargs": "~3.10.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.5.7",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
|
||||
}
|
||||
}
|
||||
},
|
||||
"uglify-to-browserify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
||||
"optional": true
|
||||
},
|
||||
"void-elements": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
|
||||
"integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
|
||||
},
|
||||
"window-size": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
||||
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
|
||||
},
|
||||
"with": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
|
||||
"integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
|
||||
"requires": {
|
||||
"acorn": "^3.1.0",
|
||||
"acorn-globals": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
|
||||
},
|
||||
"yargs": {
|
||||
"version": "3.10.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
|
||||
"requires": {
|
||||
"camelcase": "^1.0.2",
|
||||
"cliui": "^2.1.0",
|
||||
"decamelize": "^1.0.0",
|
||||
"window-size": "0.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
package.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "site",
|
||||
"version": "1.0.0",
|
||||
"description": "deuxfleurs.fr",
|
||||
"main": "render.js",
|
||||
"dependencies": {
|
||||
"jstransformer-markdown-it": "^2.1.0",
|
||||
"marked": "^0.8.0",
|
||||
"pug": "^2.0.4"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@git.deuxfleurs.fr:Deuxfleurs/site.git"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
36
rapport.md
|
@ -1,36 +0,0 @@
|
|||
# DeuxFleurs, un site accessible ? -- Sommaire exécutif
|
||||
|
||||
_Lundi 12 février 2024, par Adrian Rosin & Adrien Luxey-Bitri_
|
||||
|
||||
## Des principes solides
|
||||
|
||||
Dans l’ensemble, deuxfleurs a posé des bases solides en termes d’accessibilité. Le code est correctement structuré et pensé pour garantir une accessibilité maximale. Il met en pratique les principaux standards d’accessibilité issus de W3C, ce qui témoigne de la qualité du travail réalisé. Il faut également noter que pour chaque élément du site, des recherches ont été réalisées, rien n'a été laissé au hasard et une attention méticuleuse quant à l'accessibilité a été pensée.
|
||||
|
||||
Par conséquent, on s’aperçoit que deuxfleurs, avant même de passer des tests fonctionnels, valide la plupart des principes d’accessibilité sur le web. Le site valide par exemple les instructions que met à disposition Access42 (https://access42.net/ressources/site-web-accessible/), une coopérative française qui réalise des audits sur l’accessibilité numérique et dont les critères post-audit permettent dans un premier temps de savoir si un site est sur la bonne direction ou non.
|
||||
|
||||
## Tests fonctionnels
|
||||
|
||||
Si l’on passe le site sur des outils permettant de vérifier l’accessibilité (ADA, WCAG, WCAG2, … Pour plus d'informations, voir https://www.w3.org/WAI/ER/tools//index.html), celui-ci passe plus des trois quarts des tests concernant l’accessibilité. Les tests critiques passant dans l’intégralité. Les seuls tests non validés sont des erreurs potentielles sujettes à interprétation, qui résultent d'un choix conscient chez Deuxfleurs (commande artistique).
|
||||
|
||||
Pour donner des exemples de suggestions d'améliorations d'accéssibilité que l'on peut proposer après une première analyse du site :
|
||||
l’utilisation de balises `svg` à la place de balises préformatées `pre` pour gérer l’ASCII art en terme d’image et non en terme de texte ;
|
||||
l'affichage des calendriers en tant qu’objet (`table`) plutôt qu’en texte sous balise préformatée ;
|
||||
l'augmentation du contraste texte/fond…
|
||||
|
||||
En deuxième analyse, on comprend que les idées ci-dessus ont été analysées, et que les solutions retenues résultent d'un compromis entre accessibilité et démarche artistique.
|
||||
|
||||
## Commande artistique
|
||||
|
||||
Il a été demandé à la créatrice du site de concevoir un site simple et léger (sans image sauf l'illustration de Ronce).
|
||||
De plus, le code HTML se lit comme un journal, où ASCII art et textes se succèdent sans friction.
|
||||
On comprend mieux alors, que l'usage de `svg` contredit l'esprit recherché, puisqu'il ajoute une lourdeur inutile au code source.
|
||||
|
||||
## En pratique
|
||||
|
||||
Le site dans son ensemble actuel peut être considéré comme accessible. Lorsque le site est utilisé avec un narrateur, tout le contenu est décrit de manière simple et fluide assurant une bonne compréhension de celui-ci pour tous les utilisateurs. Malgré cela, le résultat obtenu diffère en fonction du système d’exploitation, du narrateur utilisé ou même du paramétrage de celui-ci.
|
||||
|
||||
A ce titre, une expérience à plus grande échelle impliquant des personnes directement concernées par les lecteurs d’écran pourrait nous en apprendre davantage quant à l’accessibilité de deuxfleurs.
|
||||
|
||||
## Nous contacter
|
||||
|
||||
Si vous souhaitez nous faire des retours concernant l’accessibilité du site deuxfleurs, vous pouvez nous contacter [ici](https://matrix.to/#/#accessibilite:deuxfleurs.fr) ou via coucou _chez_ deuxfleurs.fr
|
264
render.js
Normal file
|
@ -0,0 +1,264 @@
|
|||
'use strict'
|
||||
|
||||
const pug = require('pug')
|
||||
const marked = require('marked')
|
||||
const fs = require('fs').promises
|
||||
const http = require('http')
|
||||
|
||||
const unit = (...args) => null
|
||||
const log = process.env.VERBOSE ? console.log : unit
|
||||
|
||||
const walk = async (path, filename) => {
|
||||
log('[walk]', path)
|
||||
const type = await fs.lstat(path)
|
||||
if (type.isFile()) return {type: 'file', path: path, name: filename || path, tags:[]}
|
||||
if (!type.isDirectory()) return null
|
||||
|
||||
const files = await fs.readdir(path)
|
||||
return {
|
||||
type: 'folder',
|
||||
path: path,
|
||||
name: filename || path,
|
||||
tags: [],
|
||||
children: await Promise.all(files.map(file => walk(`${path}/${file}`, file)))
|
||||
}
|
||||
}
|
||||
|
||||
const ext_static = ['.css', '.js', '.otf', '.png', '.svg', '.txt', '.png', '.jpg', 'client', 'server']
|
||||
const ext_md = ['.md', '.markdown']
|
||||
const ext_pug = ['.pug', '.jade']
|
||||
|
||||
const suffix = file => ext => file.substring(file.length - ext.length) == ext ? ext : null
|
||||
const suffixl = (...l) => file => l.find(suffix(file))
|
||||
const is_static = suffixl(...ext_static)
|
||||
const is_md = suffixl(...ext_md)
|
||||
const is_pug = suffixl(...ext_pug)
|
||||
const is_templated = f => is_md(f) /* || is_rst(f) */
|
||||
const is_document = f => is_templated(f) || is_pug(f)
|
||||
|
||||
const prefix = file => ext => file.substring(0, ext.length) == ext ? ext : null
|
||||
const prefixl = (...l) => file => l.find(prefix(file))
|
||||
|
||||
const rm_prefix = (...l) => file => file.substring(prefixl(...l)(file).length)
|
||||
const rm_suffix = (...l) => file => file.substring(0, file.length - suffixl(...l)(file).length)
|
||||
|
||||
const propagate_md_layout = (tree, markdown_template) => {
|
||||
if (tree.type == 'file' && is_templated(tree.name)) {
|
||||
tree.template = markdown_template
|
||||
log('[propagate_md_layout]', tree ? tree.path : null, markdown_template ? markdown_template.path : null)
|
||||
} else if (tree.type == 'folder') {
|
||||
const find_md_tpl = tree.children.filter(c => c.type == 'file' && c.name == '_markdown.pug')
|
||||
const new_md_tpl = find_md_tpl.length > 0 ? find_md_tpl[0] : markdown_template
|
||||
tree.children.forEach(c => propagate_md_layout(c, new_md_tpl))
|
||||
}
|
||||
return tree
|
||||
}
|
||||
|
||||
const elagate = tree => {
|
||||
if (tree.type != 'folder') return tree
|
||||
|
||||
const lh = e => log('[elagate]', e.path) && false
|
||||
tree.children = tree.children.filter(e => !(e.name[0] == '_') || lh(e))
|
||||
tree.children.forEach(elagate)
|
||||
return tree
|
||||
}
|
||||
|
||||
const tag_document = tree => {
|
||||
if (tree.type == 'file' && is_document(tree.name) && tree.name[0] != '@') {
|
||||
tree.tags.push('document_leaf', 'document')
|
||||
log('[tag_document]', tree.path, 'document_leaf')
|
||||
} else if (tree.type == 'folder') {
|
||||
tree.children.forEach(tag_document)
|
||||
if(tree.children.some(c => c.tags.includes('document'))) {
|
||||
tree.tags.push('document_branch', 'document')
|
||||
log('[tag_document]', tree.path, 'document_branch')
|
||||
}
|
||||
}
|
||||
return tree
|
||||
}
|
||||
|
||||
const reference_index = indexes => tree => {
|
||||
if (tree.type != 'folder') return tree;
|
||||
|
||||
const index = tree.children.find(e => indexes.includes(e.name))
|
||||
if (index) {
|
||||
tree.index = index
|
||||
tree.tags.push('has_index')
|
||||
log('[reference_index]', tree.path, index.name)
|
||||
index.tags.push('is_index')
|
||||
}
|
||||
tree.children.forEach(reference_index(indexes))
|
||||
|
||||
return tree;
|
||||
}
|
||||
|
||||
const propagate_nice_name = prefix => tree => {
|
||||
const without_prefix = tree.path.substring(prefix.length)
|
||||
const splitted = without_prefix.split('/').filter(v => v.length > 0)
|
||||
if (splitted.length > 0) {
|
||||
tree.nice_path = splitted.slice(0, -1)
|
||||
tree.nice_name = splitted[splitted.length - 1].split('.')[0]
|
||||
tree.url = without_prefix
|
||||
log('[propagate_nice_name]', [...tree.nice_path, tree.nice_name].join('|'))
|
||||
}
|
||||
|
||||
if (tree.type == 'folder') tree.children.forEach(propagate_nice_name(prefix))
|
||||
return tree
|
||||
}
|
||||
|
||||
const prepare_copy = (old_prefix, new_prefix, exts) => tree => {
|
||||
if (tree.type == 'file' && is_static(tree.name)) {
|
||||
tree.generate = {
|
||||
cmd: 'copy',
|
||||
src: tree.path,
|
||||
out: new_prefix + rm_prefix(old_prefix)(tree.path)
|
||||
}
|
||||
log('[prepare_copy]',tree.generate.src,'->',tree.generate.out)
|
||||
} else if (tree.type == 'folder') {
|
||||
tree.children.forEach(prepare_copy(old_prefix, new_prefix, exts))
|
||||
}
|
||||
return tree
|
||||
}
|
||||
|
||||
const prepare_pug = (old_prefix, new_prefix) => tree => {
|
||||
if (tree.type == 'file' && is_pug(tree.name)) {
|
||||
tree.old_url = tree.url
|
||||
tree.url = rm_prefix(old_prefix)(rm_suffix(...ext_pug)(tree.path)) + '.html'
|
||||
tree.generate = {
|
||||
cmd: 'pug',
|
||||
src: tree.path,
|
||||
out: new_prefix + tree.url
|
||||
}
|
||||
log('[prepare_pug]',tree.generate.src,'->',tree.generate.out)
|
||||
}
|
||||
else if (tree.type == 'folder') {
|
||||
tree.children.forEach(prepare_pug(old_prefix, new_prefix))
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
|
||||
const prepare_md = (old_prefix, new_prefix) => tree => {
|
||||
if (tree.type == 'file' && is_md(tree.name)) {
|
||||
tree.old_url = tree.url
|
||||
tree.url = rm_prefix(old_prefix)(rm_suffix(...ext_md)(tree.path)) + '.html'
|
||||
tree.generate = {
|
||||
cmd: 'pug',
|
||||
src: tree.template.path,
|
||||
markdown: tree.path,
|
||||
out: new_prefix + tree.url
|
||||
}
|
||||
log('[prepare_md]',tree.generate.markdown,'+',tree.generate.src,'->',tree.generate.out)
|
||||
}
|
||||
else if (tree.type == 'folder') {
|
||||
tree.children.forEach(prepare_md(old_prefix, new_prefix))
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
|
||||
const prepare_folder = (old_prefix, new_prefix) => tree => {
|
||||
if (tree.type == 'folder') {
|
||||
tree.generate = {
|
||||
cmd: 'mkdir',
|
||||
out: new_prefix + rm_prefix(old_prefix)(tree.path)
|
||||
}
|
||||
log('[prepare_folder]',tree.generate.out)
|
||||
tree.children.forEach(prepare_folder(old_prefix, new_prefix))
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
|
||||
const do_folder = async tree => {
|
||||
if (!tree.generate || tree.generate.cmd != 'mkdir') return tree
|
||||
await fs.mkdir(tree.generate.out, { recursive: true })
|
||||
log('[do_folder]',tree.generate.out)
|
||||
await Promise.all(tree.children.map(do_folder))
|
||||
return tree
|
||||
}
|
||||
|
||||
const do_copy = async tree => {
|
||||
if (tree.generate && tree.generate.cmd == 'copy') {
|
||||
await fs.copyFile(tree.generate.src, tree.generate.out)
|
||||
log('[do_copy]',tree.generate.out)
|
||||
} else if (tree.type == 'folder')
|
||||
await Promise.all(tree.children.map(do_copy))
|
||||
|
||||
return tree
|
||||
}
|
||||
|
||||
const do_pug = (prt, root) => async tree => {
|
||||
prt = prt || tree
|
||||
root = root || tree
|
||||
if (tree.generate && tree.generate.cmd == 'pug') {
|
||||
const html = pug.renderFile(tree.generate.src, {
|
||||
markdown: tree.generate.markdown ? marked(await fs.readFile(tree.generate.markdown, 'utf-8')) : null,
|
||||
root: root,
|
||||
prt: prt,
|
||||
element: tree
|
||||
})
|
||||
await fs.writeFile(tree.generate.out, html)
|
||||
log('[do_pug]',tree.generate.out)
|
||||
} else if (tree.type == 'folder')
|
||||
await Promise.all(tree.children.map(do_pug(tree,root)))
|
||||
|
||||
return tree
|
||||
}
|
||||
|
||||
const rm_tree = t => {
|
||||
if (t == null) return
|
||||
if (t.type == 'file') {
|
||||
log('[do_clean] file', t.path)
|
||||
return fs.unlink(t.path)
|
||||
}
|
||||
|
||||
return Promise
|
||||
.all(t.children.map(rm_tree))
|
||||
.then(_ => {
|
||||
log('[do_clean] path', t.path)
|
||||
return fs.rmdir(t.path)
|
||||
})
|
||||
}
|
||||
|
||||
const do_clean = path => tree =>
|
||||
walk(path)
|
||||
.catch(_ => null)
|
||||
.then(rm_tree)
|
||||
.then(_ => tree)
|
||||
|
||||
const listen = async t =>
|
||||
process.env.LISTEN &&
|
||||
http.createServer(async (req,res) => {
|
||||
const file = fs.readFile(__dirname + '/static/' + decodeURI(req.url))
|
||||
.catch(_ => fs.readFile(__dirname + '/static/' + decodeURI(req.url) + '/index.html'))
|
||||
|
||||
try {
|
||||
const f = await file
|
||||
res.writeHead(200)
|
||||
res.end(f)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
res.writeHead(404)
|
||||
res.end("404 not found")
|
||||
}
|
||||
}).listen(process.env.LISTEN);
|
||||
|
||||
const conf = { src: './src', dest: './static'}
|
||||
walk(conf.src)
|
||||
.then(propagate_md_layout)
|
||||
.then(elagate)
|
||||
.then(tag_document)
|
||||
.then(reference_index(['index.md', 'index.pug']))
|
||||
.then(propagate_nice_name(conf.src))
|
||||
.then(prepare_copy(conf.src, conf.dest))
|
||||
.then(prepare_pug(conf.src, conf.dest))
|
||||
.then(prepare_md(conf.src, conf.dest))
|
||||
.then(prepare_folder(conf.src, conf.dest))
|
||||
//.then(v => {log(v) ; return v})
|
||||
.then(do_clean(conf.dest))
|
||||
.then(do_folder)
|
||||
.then(do_copy)
|
||||
.then(do_pug())
|
||||
.then(listen)
|
||||
.catch(console.error)
|
|
@ -1,417 +0,0 @@
|
|||
.——————————————————————————————————————.
|
||||
| CALENDRIER OCTOBRE 2022 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— |
|
||||
| | 01 | 02 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 31 | |
|
||||
| ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER NOVEMBRE 2022 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | 06 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 07 | 08 | 09 | 10 | 11 | 12 | 13 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 21 | 22 | 23 | 24 | 25 | 26 | 27 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER DÉCEMBRE 2022 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 26 | 27 | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER JANVIER 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— |
|
||||
| | 01 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 30 | 31 | |
|
||||
| ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER FÉVRIER 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 27 | 28 | |
|
||||
| ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER MARS 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 27 | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER AVRIL 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— |
|
||||
| | 01 | 02 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER MAI 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER JUIN 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 26 | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER JUILLET 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— |
|
||||
| | 01 | 02 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 31 | |
|
||||
| ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER AOÛT 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | 06 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 07 | 08 | 09 | 10 | 11 | 12 | 13 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 21 | 22 | 23 | 24 | 25 | 26 | 27 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER SEPTEMBRE 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 25 | 26 | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER OCTOBRE 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— |
|
||||
| | 01 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 30 | 31 | |
|
||||
| ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER NOVEMBRE 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER DÉCEMBRE 2023 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER JANVIER 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER FÉVRIER 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 26 | 27 | 28 | 29 | |
|
||||
| ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER MARS 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER AVRIL 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 29 | 30 | |
|
||||
| ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER MAI 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 27 | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER JUIN 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— |
|
||||
| | 01 | 02 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER JUILLET 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER AOÛT 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 26 | 27 | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER SEPTEMBRE 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— |
|
||||
| | 01 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 30 | |
|
||||
| ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER OCTOBRE 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | 04 | 05 | 06 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 07 | 08 | 09 | 10 | 11 | 12 | 13 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 21 | 22 | 23 | 24 | 25 | 26 | 27 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 28 | 29 | 30 | 31 | |
|
||||
| ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER NOVEMBRE 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— ———— ———— |
|
||||
| | 01 | 02 | 03 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 25 | 26 | 27 | 28 | 29 | 30 | |
|
||||
| ———— ———— ———— ———— ———— ———— |
|
||||
|______________________________________|
|
||||
.——————————————————————————————————————.
|
||||
| CALENDRIER DÉCEMBRE 2024 |
|
||||
|——————————————————————————————————————|
|
||||
| ———— |
|
||||
| | 01 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
|
||||
| ———— ———— ———— ———— ———— ———— ———— |
|
||||
| | 30 | 31 | |
|
||||
| ———— ———— |
|
||||
|______________________________________|
|
|
@ -2,9 +2,6 @@
|
|||
"m.homeserver": {
|
||||
"base_url": "https://im.deuxfleurs.fr"
|
||||
},
|
||||
"org.matrix.msc3575.proxy": {
|
||||
"url": "https://im-syncv3.deuxfleurs.fr"
|
||||
},
|
||||
"m.identity_server": {
|
||||
"base_url": "https://vector.im"
|
||||
},
|
0
src/.well-known/matrix/server
Normal file
10
src/@jitsi.pug
Normal file
|
@ -0,0 +1,10 @@
|
|||
extends _layout.pug
|
||||
|
||||
prepend root
|
||||
- title = "Visioconférence"
|
||||
|
||||
|
||||
block content
|
||||
h4.spacing
|
||||
| Cette page a changé d'adresse :
|
||||
a(href="/Guide/Visioconférence.html") cliquez ici pour être redirigé
|
51
src/Association/AG 1.md
Normal file
|
@ -0,0 +1,51 @@
|
|||
# Assemblée Générale Constitutive
|
||||
|
||||
Le 13 janvier 2020 à 19 heures, les fondateurs de l'association
|
||||
Deuxfleurs se sont réunis en assemblée générale constitutive au 24 rue
|
||||
des Tanneurs à Rennes. Sont présents Adrien, Alex, Anaïs, Axelle,
|
||||
Louison, Maximilien, Quentin, Rémi et Vincent.
|
||||
|
||||
L'assemblée générale désigne Adrien en qualité de président de
|
||||
séance et Quentin en qualité de secrétaire de séance. Le
|
||||
président de séance met à la disposition des présents le projet de
|
||||
statuts de l'association et l'état des actes passés pour le compte de
|
||||
l'association en formation.
|
||||
|
||||
Puis il rappelle que l'assemblée générale constitutive est appelée à
|
||||
statuer sur l'ordre du jour suivant :
|
||||
|
||||
- présentation du projet de constitution de l'association ;
|
||||
- présentation du projet de statuts ;
|
||||
- adoption des statuts ;
|
||||
- désignation des premiers membres du conseil ;
|
||||
- pouvoirs en vue des formalités de déclaration et publication.
|
||||
|
||||
Enfin, le président de séance expose les motifs du projet de création de
|
||||
l'association et commente le projet de statuts. Il ouvre la discussion.
|
||||
Un débat s'instaure entre les membres de l'assemblée.
|
||||
|
||||
Après quoi, personne ne demandant plus la parole, le président met
|
||||
successivement aux voix les délibérations suivantes.
|
||||
|
||||
## 1e délibération
|
||||
|
||||
L'assemblée générale adopte les statuts dont le projet lui a été soumis.
|
||||
Cette délibération est adoptée à l'unanimité.
|
||||
|
||||
## 2e délibération
|
||||
|
||||
L'assemblée générale constitutive désigne en qualité de premiers membres
|
||||
du conseil d'administration :
|
||||
|
||||
- Adrien
|
||||
- Alex
|
||||
- Maximilien
|
||||
- Quentin
|
||||
- Vincent
|
||||
|
||||
Conformément aux statuts, cette désignation est faite pour une durée
|
||||
expirant lors de l'assemblée générale qui sera appelée à statuer sur les
|
||||
comptes de l'exercice clos le 13 janvier 2021. Les membres du conseil
|
||||
ainsi désignés acceptent leurs fonctions
|
||||
|
||||
Nom, prénom et signature du président et du secrétaire de séance
|
135
src/Association/Réunion 1.md
Normal file
|
@ -0,0 +1,135 @@
|
|||
## Première réunion de travail
|
||||
|
||||
Date : Février 2020
|
||||
|
||||
Présent : Quentin, Alex, Maximilien, Vincent
|
||||
Remote : Simon
|
||||
Invité : Tom
|
||||
|
||||
> Maximilien prends des notes.
|
||||
|
||||
https://p.adnab.me/pad/#/2/pad/edit/VOqs46ZeH7iR2EnL63xeXxHP/
|
||||
|
||||
Depuis l'AG 1
|
||||
-------------
|
||||
|
||||
Quentin (anime la réunion) :
|
||||
|
||||
- Migration DNS (depuis Cloudflare vers Online)
|
||||
- Ajout domaine deuxfleurs.org (acheté par Maximilien)
|
||||
- Quentin explique la partie technique
|
||||
- Alex explique les avancées sur la partie LDAP/authentification basée sur consul (bottin + guichet)
|
||||
- Ajout de l'invitation dans guichet (lien à usage unique)
|
||||
- Nettoyage des comptes LDAP
|
||||
- Mettre une étiquette deuxfleurs sur la boite de Quentin
|
||||
- Discussion avec Jaxom & Almet sur l'hébergement
|
||||
- Le site web c'est important, tout le monde en parle
|
||||
- Refondre la partie graphique pour la rendre plus attrayante et moins RFC-like
|
||||
- Alex s'est lancé dans du dev de bridge matrix qui fonctionne pour mattermost et XMPP
|
||||
- Le bridge mattermost focntionne pas mal
|
||||
|
||||
Ce que l'on n'a pas encore fait
|
||||
-------------------------------
|
||||
|
||||
Banque : la moitié des cotisations part dans une banque
|
||||
Décision de faire un pot commun ?
|
||||
Continuer sans ? (mais c'est dans les statuts)
|
||||
|
||||
> Vote : trésorerie en liquide jusqu'à 200€
|
||||
> Sinon on dépense ou bien on ouvre un compte
|
||||
|
||||
- 200€ : contre 0, neutre 0, unanimité pour
|
||||
- Fonctionner en pot commun : contre 0, neutre 0, unanimité pour
|
||||
|
||||
**Motion voté.**
|
||||
|
||||
### Gestion de la comptabilité
|
||||
|
||||
Quentin a un compte courant vide. Mais à son avis pas une bonne idéee.
|
||||
Gestion de la comptabilité sur un logiciel (lequel ?)
|
||||
Trésorier ?
|
||||
|
||||
Alex a trouvé une boite.
|
||||
|
||||
> Vote : Alex est le gardien de la boite qui contient les cotisations dans la limite de 200€
|
||||
> Contre : 0, Neutre 0, Unanimité
|
||||
|
||||
Pour le choix du logiciel, Maximilien enverra un mail avec des solutions. L'idée de base est de mettre le fichier dans un repo git (facilement backupé et consultable), avec des commit signés.
|
||||
|
||||
Pour les présents, les cotisations sont payables à la fin de l'AG.
|
||||
|
||||
### Charte
|
||||
|
||||
Trouver pour la prochaine AG (voire avant) une base. Maximilien doit envoyer des idées sur la base de ce qui est fait en conférence. Quentin envoie des idées pour les projets Open-Source.
|
||||
|
||||
### Site web
|
||||
|
||||
Intégrer la documentation au site web, afin qu'elle soit consultable et plus transparent par rapport aux infrastructures.
|
||||
|
||||
Outil pour build du Markdown avec un blog statique.
|
||||
Utiliser les outils de templating des trucs web.
|
||||
|
||||
Quentin fera une proposition.
|
||||
Simon : Les gens qui font des choses se doivent de les documenter.
|
||||
|
||||
À qui s'adresse la documentation :
|
||||
- tout ce qui tourne autour de l'administration
|
||||
- de l'accessibilité
|
||||
- la partie technique
|
||||
|
||||
Répliquer le gitea d'Adrien (Maximilien va leur faire sur le sien).
|
||||
|
||||
### Lieux de réunion
|
||||
|
||||
Vincent propose le salon de thé (on peut commander un café), mais on est trop bruyant ?
|
||||
|
||||
Pas de souci tant que l'on rentre dans un salon de chez quelqu'un (jusqu'à 10-12 personnes)
|
||||
|
||||
Les objectifs
|
||||
-------------
|
||||
|
||||
Quentin : but original du CHATON, documenter l'auto-hébergement distribué, fournir des services que tu gères toi-même, sans manipulation ni tracking
|
||||
|
||||
Trois niveaux :
|
||||
- petits services
|
||||
- backups et disaster-recovery
|
||||
- CHATON (candidature chez framasoft et référencement) : l'objectif est-il d'obtenir le label ou bien simplement de s'inspirer de leur idéal ?
|
||||
|
||||
> Simon : pour la partie non technique, sauf si cela présente un effort technique trop important.
|
||||
> Quentin : leur cahier des charges n'est pas aberrant et pourrait être un guide sur le développement de l'infra
|
||||
|
||||
**TODO** : faire un document de travail (Quentin a fait une milestone dans le gitea)
|
||||
- géo-distribué (résilient à la perte d'une machine/d'un site - penser datacenter)
|
||||
|
||||
**TARGET** soumettre une candidature _CHATON_ dans 6 mois
|
||||
|
||||
Pour la géo-distribution, Quentin préconise le backend S3-compatible
|
||||
Approche totalement différente des ressources.
|
||||
|
||||
Débat à suivre.
|
||||
|
||||
### Recommandations
|
||||
|
||||
Quentin : si jamais on embarque des gens et que l'on leur fait faux bond, on dessert la cause de l'hébergement participatif.
|
||||
|
||||
Alex : il est de la responsabilité des personnes qui créent un compte de s'informer des limites
|
||||
|
||||
Simon : par cooptation : chacun voit midi à sa porte.
|
||||
|
||||
> Vote : Maximilie propose l'ajout d'un avertissement sur le formulaire d'inscription de guichet. La rédaction du bloc de text est laissé à Maximilien, et soumise à l'approbation du prochain conseil d'afministration.
|
||||
> Contre : 0, Neutre 0, Unanimité
|
||||
|
||||
Repasser sur le document de travail
|
||||
-----------------------------------
|
||||
|
||||
Alex : priorité de faire le site web et d'avoir une solution facilement éditable pour les PV d'AG & co (pas tout le temps dépendre des pads)
|
||||
|
||||
Quentin : les PV en PDF sont stockés dans un repos
|
||||
|
||||
Retex de Toms
|
||||
-------------
|
||||
|
||||
Toms est intéressé pour rejoindre l'association.
|
||||
Pas assez de vison pour savoir si c'est réalisable.
|
||||
|
||||
Quentin montre la nouvelle maquette du site web.
|
233
src/Association/Réunion 2.md
Normal file
|
@ -0,0 +1,233 @@
|
|||
# Deuxième réunion de travail
|
||||
|
||||
## Lieu et date
|
||||
|
||||
Date : 10h le samedi 16 mai 2020
|
||||
|
||||
Lieu : [jitsi.deuxfleurs.fr/asso](https://jitsi.deuxfleurs.fr/asso)
|
||||
|
||||
## Compte rendu
|
||||
|
||||
Alex, Max, Adrien, Vincent, Quentin
|
||||
|
||||
On s'accorde sur le temps accordé aux 3 grandes parties
|
||||
|
||||
- 15 min les valeurs
|
||||
- 30 min le debrief
|
||||
- 30 min les objectifs
|
||||
|
||||
### Discussion sur les valeurs
|
||||
|
||||
Pour les valeurs, Quentin présente une liste d'objectifs qui lui semble importants.
|
||||
Réorganisation de la structure sous forme des valeurs (cf page d'accueil du site web).
|
||||
Essaye de donner des éléments précis.
|
||||
C'est aussi une sorte de note d'intention pour plus tard pour nous aider à faire des choix.
|
||||
|
||||
Proposition d'Adrien :
|
||||
- notre -> la pour les valeurs
|
||||
|
||||
### Point sur les droits
|
||||
|
||||
Clarifier le process d'ajout de nouveaux membres administrateurs de l'infrastructure.
|
||||
|
||||
Est identifié comme relatif à l'infrastructure :
|
||||
- L'accès à l'organisation Deuxfleurs de git (infrastructure, etc.)
|
||||
- L'accès à la solution d'interconnexion des services (Consul Connect, VPN)
|
||||
|
||||
### Points sur les documents dits "internes"
|
||||
|
||||
Sont concernés:
|
||||
|
||||
- Liste des membres
|
||||
- Comptabilité de l'asso
|
||||
- Notes interne au CA concernant les procédures de gestion etc.
|
||||
|
||||
Créer un repo git privé dans l'orga Deuxfleurs du gitea.
|
||||
|
||||
### Debrief des deux mois
|
||||
|
||||
|
||||
#### Site web
|
||||
|
||||
Sur ces deux derniers mois, on a déployé notre site web.
|
||||
Le système est simple (pour une personne connaissant git) : on push des fichiers Markdown et le site se met à jour tout seul (generateur statique + webhook)
|
||||
|
||||
Design graphique perfectible : on pourrait engager un designer graphique. Mais probablement le payer.
|
||||
Pour le contenu fouilli : ça évolue beaucoup et vite, Adrien trouve que ça commence à s'organiser.
|
||||
|
||||
**Plateforme d'hébergement de site ?** Adrien a une plateforme Wordpress en place.
|
||||
Quentin préfère l'hébergement de fichiers statique.
|
||||
Quentin aimerait proposer un système basé sur l'API S3 de Garage.
|
||||
- Les utilisateur créer un bucket depuis Guichet
|
||||
- Ensuite, ils construisent leur site en local via le logiciel libre [Publii](https://getpublii.com/).
|
||||
- Ils configurent les identifiants S3 de deuxfleurs dans ce logiciel et cliquent sur "Déployer"
|
||||
|
||||
Les avantages de ce système :
|
||||
- Ultra léger (sobriété numérique)
|
||||
- Sécurisé (on ne manipuler que des fichiers de notre côté)
|
||||
|
||||
Par contre, on est très loin de pouvoir le mettre en place.
|
||||
Le système d'Adrien plus conventionnel et ne nécessitant pas d'installer de logiciel particulier est déjà disponible.
|
||||
|
||||
**Est ce qu'on pourrait faire un blog / aggrégateur de contenu ?**
|
||||
Pour l'instant le plus simple serait de mettre un planet.
|
||||
Vincent, Adrien et moi aurions des choses à dire pour un planet.
|
||||
Quelques idées d'articles :
|
||||
|
||||
- J'en ai marre de Google, aidez-moi !
|
||||
- Je hais mon smartphone
|
||||
- Sobriété numérique : nos réflexions (à bas les petits gestes)
|
||||
|
||||
|
||||
#### Jitsi
|
||||
|
||||
Focus sur quelques points :
|
||||
- Voix aigues (femmes) qui ne passent pas (Codec low bitrate ? Firmware ? Micro)
|
||||
- Configuration du videobridge qui change (hack routing nginx)
|
||||
- Point sur l'avancement Firefox à faire à la prochaine réunion
|
||||
|
||||
Rémi a mis en place son jitsi également.
|
||||
Alex a utilisé le Jitsi avec 15 personnes.
|
||||
|
||||
#### Garage
|
||||
|
||||
Objectif : remplacer GlusterFS trop lent / trop buggé.
|
||||
Veut se faire passer pour un "vrai" système de fichiers qui pourrait être une raison des lenteurs.
|
||||
À la place on voudrait cibler plus simple : un object storage.
|
||||
State of the art : le plus prometteur est Minio mais restrictions bizarres.
|
||||
|
||||
Alex a fait de Garage son projet de confinement.
|
||||
On a une version "beta" qui fonctionne avec Nextcloud.
|
||||
|
||||
Question qui reste en suspens : la fiabilité ?
|
||||
Le modèle : les données sont répliquées 3 fois.
|
||||
|
||||
Si tu as des machines sur des sites/datacenters différents, tu peux les dispatcher sur différents datacenters.
|
||||
À quel point la solution est fiable ?
|
||||
Il faudrait faire des tests : analyser plus le code.
|
||||
|
||||
Soucis techniques : congestion entre datacenters.
|
||||
Controler le nombre de requetes que tu envoies.
|
||||
|
||||
On ne voudrait pas détruire l'information directement.
|
||||
Backup vs suppression de données.
|
||||
|
||||
Vincent pense à la suppression scabreuse de Facebook qui ne faisait que déréférancer les fichiers de l'interface mais ces derniers étaient toujours accessible publiquement via leur URL [référence](https://arstechnica.com/information-technology/2010/10/facebook-may-be-making-strides/).
|
||||
|
||||
Préciser la politique (30 jours, un admin peut y accéder, elles peuvent être restaurées en cas d'accident majeur).
|
||||
|
||||
#### [Garage Kids](https://codelyoko.fandom.com/fr/wiki/Garage_Kids) : foire à l'espace disque
|
||||
|
||||
Commencer les expérimentations sur Garage.
|
||||
|
||||
Liste de l'espace disque :
|
||||
- Quentin : 3 x 1To
|
||||
- Adrien (un NAS plus tard ?! Ses parents ?! Synology ouvert ?! [docker](https://www.synology.com/fr-fr/dsm/packages/Docker)) - rien de précis pour l'instant
|
||||
- Maximilien : 1To
|
||||
- Alex : peut libérer >1To sur serveur Kimsufi (donc en datacenter et non en auto-hébergé)
|
||||
|
||||
Stockage des backups :
|
||||
- Offsite ?
|
||||
- Dans Garage ?
|
||||
|
||||
Adrien pensait du backup avec des rsync/tar.
|
||||
Adrien a commencé à faire du backup.
|
||||
|
||||
Maximilien met à disposition un VM pour le backup de la stack chez Quentin
|
||||
|
||||
#### Interconnexion
|
||||
|
||||
Battle Royal : VPN (supporter : Alex) vs Service Mesh (supporter : Quentin)
|
||||
|
||||
Contexte/But : Essayer d'avoir des machines dans différents datacenters. On voudrait les interconnecter entre elles.
|
||||
Le cas d'usage c'est le LDAP, pour le consommer depuis des machines.
|
||||
Wireguard est un module noyau, bonne efficacité.
|
||||
|
||||
Trouver comment on va expérimenter l'interconnexion.
|
||||
On aurait besoin de VM derrière des NAT -> réalisme du déploiement.
|
||||
|
||||
La réunion se termine sur ces belles paroles :-)
|
||||
|
||||
---
|
||||
|
||||
## (Archives) Ordre du jour
|
||||
|
||||
- Nos valeurs :
|
||||
- protèger notre vie privée
|
||||
- économie de la surveillance
|
||||
- défendre notre liberté d'expression
|
||||
- économie de la surveillance
|
||||
- ne pas se laisser manipuler
|
||||
- économie de l'attention
|
||||
- choisir la sobriété numérique
|
||||
- prendre les décisions ensemble
|
||||
- mettre en commun nos connaissances et nos infrastructures
|
||||
- consommation excessive (obsolescence, incompatibilités, gadgets)
|
||||
- protection libertés:
|
||||
- on ne censure pas - dans les limites de la loi - ce que vous voulez partager
|
||||
- ne vous manipule pas
|
||||
- on répond à un besoin, on fournit des outils
|
||||
- on n'essaye pas d'augmenter le temps passé sur nos services
|
||||
- on ne propose pas de recommandations automatisées ou d'algorithmes "boite noire" dont le fonctionnement serait inconnu ou inexplicable
|
||||
- on valorise la transparence, tout est public par défaut (comme nos compte-rendus d'AG ou notre documentation technique)
|
||||
- promeut la sobriété numérique:
|
||||
- on réutilise du vieux matériel tant qu'on peut
|
||||
- on optimise le logiciel
|
||||
- solidaires ([définition 2 du CNRTL](https://www.cnrtl.fr/definition/solidaire), peut etre pas le bon mot)
|
||||
- choix de services grand public (jitsi plutôt que mumble, matrix plutot que IRC, etc.)
|
||||
- documentation / aide pour l'utilisation de ces services
|
||||
- valoriser et légitimer l'accompagnement humain dans l'usage des services, mis en valeur par le choix du parrainage.
|
||||
- participatif
|
||||
- mettre en commun le savoir
|
||||
- Déploiement de Jitsi
|
||||
- mettre en commun le code
|
||||
- Code publié sous license libre
|
||||
- mettre en commun les infrastructures
|
||||
- backups chez Maximilien
|
||||
- git chez Adrien
|
||||
- matrix chez Quentin
|
||||
- faire les choix collectivement, diluer le pouvoir
|
||||
- association collégiale
|
||||
- Temps de discussion avec les nouveaux / invités
|
||||
- Debrief des deux mois
|
||||
- Déploiement du site web
|
||||
- Déploiement et debug du Jitsi
|
||||
- Manque de doc : gestion du TURN
|
||||
- User and Developer Experience pretty bad
|
||||
- Problème avec le traitement de l'audio : voix féminines coupées
|
||||
- Succès dans mon entourage
|
||||
- Échec sur l'ADSL
|
||||
- Conclusion : la pire solution de VoIP à l'exception de toutes les autres !
|
||||
- Développement de Garage
|
||||
- Soucis de congestion entre datacenters: gestion des connexions sortantes à améliorer
|
||||
- Opérations de suppression: TODO garder les vieilles versions pour un certain temps (30 jours) pour éviter toute fausse manip
|
||||
- Ça semble fonctionner bien avec NextCloud
|
||||
- Est-on prêts à se lancer dans un test grandeur nature ?
|
||||
- Interconnectons nos infrastructures. [Plus d'informations par ici](/Technique/Jalon/Interconnexion.html)
|
||||
- La foire à l'espace disque : échangeons nos backups !
|
||||
- Quels espaces sont déjà disponibles ?
|
||||
- Quels projets de développement ? (Adrien se paiera un NAS, un jour. Max a fourni un serveur à installer.)
|
||||
- Mes parents (Adrien) ont un Synology. Ca sert à autre chose que le chauffage ? Ya moyen de l'exploiter ?
|
||||
- Le site web
|
||||
- Problèmes :
|
||||
- UI pas responsive (ça reste lisible néanmoins)
|
||||
- Quentin : Problème réglé
|
||||
- Esthétique à améliorer : je veux des roses cyberpunk.
|
||||
- On connaît des designers motivés ?
|
||||
- Contenu fouillis, manque de contexte
|
||||
- Réfléchir à une structure
|
||||
- Quels sont les objectifs et contraintes du site ?
|
||||
- Quentin mentionnait un besoin de fonctionner sans JS, une page légère... On pourrait en discuter et mettre ça au propre ?
|
||||
- Quentin : [Comment créer un site web basse technologie](https://solar.lowtechmagazine.com/fr/2018/09/how-to-build-a-lowtech-website.html) : ici ce n'est pas l'économie d'énergie du serveur qui nous intéresse mais une compatibilité fluide avec les vieux terminaux et les mauvaises connectivités mobiles. Je sais de quoi je parle, mes parents ont un ADSL de piètre qualité.
|
||||
- Quentin : C'est d'autant plus important qu'en favorisant de vieille machines derrière des connexions domestique, on a une contrainte de départ plus forte sur le matériel et on a pas de CDN pour masquer le manque d'opti/lourdeur du site web traditionnel
|
||||
- Adrien dit : "Fuck SCSS/SASS, vive CSS"
|
||||
- Framework HTML/CSS
|
||||
- "cross-browser consistency" au minimum ([normalize.css](http://nicolasgallagher.com/about-normalize-css/))
|
||||
- responsive design & utilities ([Foundation](https://get.foundation/sites/docs/), [Pure](https://purecss.io/), Bootstrap... Adrien connaît bien Foundation, un truc comme Pure serait plus léger)
|
||||
- Quentin : À voir ce que les frameworks apportent de plus une fois un reset CSS + flexbox + media queries en place. Qui plus est, tout n'est pas configurable dans bootstrap et on se retrouve vite à empiler des hacks.
|
||||
- On fait un blog ?
|
||||
- J'ai (Adrien) quelques projets de guides et d'articles sur les libertés numériques - j'imagine que vous aussi. On pourrait proposer des articles sur blog.deuxfleurs.fr, et/ou faire un agrégateur de nos propres blogs (si vous en avez tous un, moi pas).
|
||||
- Quentin : Dans l'absolu si on peut faire le blog sur la meme plateforme que le site web, je trouverais ça bien. Sinon, un truc à penser ce serait ActivityPub pour que les gens puissent suivre le blog dans leur Mastodon par exemple, aka le Fediverse.
|
||||
- Quentin : Voir si blog peut être sur Mobilizon et déployer une instance de ce dernier donc si on veut de l'ActivityPub et qu'on peut pas l'intégrer sur le site statique.
|
||||
|
||||
*N'hésitez pas à compléter ce document en modifiant le fichier `src/Association/Réunion_2.md` du [dépôt du site Deuxfleurs](https://git.deuxfleurs.fr/Deuxfleurs/site)*
|
50
src/Association/Réunion 3.md
Normal file
|
@ -0,0 +1,50 @@
|
|||
# 3ème réunion de travail
|
||||
|
||||
**Date :** À définir, ~ 15 juillet 2020
|
||||
**Lieu :** À définir
|
||||
|
||||
## Objectifs d'ici la réunion
|
||||
|
||||
Quentin :
|
||||
|
||||
* ✅ Retour Planet : est ce que c'est utile ? on peut référencer nos articles à la main dans un premier temps ? Référencer l'article StopCovid
|
||||
* ✅ Finir une v1 de Diplonat.
|
||||
* ✅ Déployer une V1 de Platoo
|
||||
* ⌛ Faire des backups sur la machine de Max.
|
||||
* ⌛ Penser à vérifier avant la réunion l'état du support de Jitsi par Firefox
|
||||
* Semblerait OK via @Vincent : https://linuxfr.org/news/firefox-76-dites-septantesix#toc-prise-en-charge-de-jitsi
|
||||
* ⌛ Email
|
||||
* ⌛ Ajouter une doc pour expliquer comment rajouter un nouveau domaine
|
||||
* ✅ Chercher des pistes pour réparer IMAP qui est lent ?
|
||||
* Cyrus IMAP -> pas d'abstraction du stockage, Cyrus Murder pour de la replication ad hoc
|
||||
* [DarkMail](https://darkmail.info/downloads/dark-internet-mail-environment-june-2018.pdf) - ex Lavabit. Abandonné
|
||||
* [Maddy](https://foxcpp.dev/maddy/) - Caddy de l'email, pas d'abstraction sur le stockage non plus
|
||||
* Rien de probant de manière générale.
|
||||
* Propositions :
|
||||
1. Utiliser la réplication d'IMAP plutot que GlusterFS dans un premier temps
|
||||
2. Écrire un backend S3/Garage pour plus tard maybe en Go/OCaml/Rust (qui peuvent tous compiler en bibliothèque dynamique C)
|
||||
* Accepter la PR#1 d'Alex
|
||||
* Mettre à jour Consul+Nomad
|
||||
* Fix le boot du cluster
|
||||
* fstab lu avant le boot de GlusterFS
|
||||
* nomad+consul démarrés avant le réseau
|
||||
* Peaufiner le site web et demander un retour à un·e designer graphique.
|
||||
* Écrire un article du type "Un usage plus éthique du numérique : des perspectives concrètes"
|
||||
* Écrire/transmettre un appel à contribution à la VM/Conteneur pour les tests de deuxfleurs distribué avec un cahier des charges. exemple :
|
||||
* 300 Mo de RAM
|
||||
* Linux
|
||||
* Plage de ~10 ports en UDP+TCP ouverts (peu importe lesquels mais les mentionner)
|
||||
* Une IPv4 ou une IPv6 publique (besoin que de ~10 ports dans le cas du NAT)
|
||||
* Fournir un accès SSH à ces clés : https://git.deuxfleurs.fr/Deuxfleurs/deuxfleurs.fr/src/branch/master/ansible/roles/users/files
|
||||
* Mettre à disposition une VM/Conteneur sur mon PC fixe à Lyon (pas chaud pour utiliser le cluster de prod pour les tests)
|
||||
* Faire un PoC sur Consul Connect
|
||||
|
||||
Alex :
|
||||
|
||||
* Repo git "interne" avec la compta
|
||||
* PoC infra à base de VPN
|
||||
* Garage:
|
||||
- À coder: garder les données 30 jours lors d'une suppression
|
||||
- Tests de fiabilité
|
||||
- Déploiement beta sur le cluster, peut se configurer en TLS direct entre les datacenters (sans VPN ou Consul Connect)
|
||||
- Interface web de gestion: dans Guichet (mieux) ou à part (plus simple)
|
126
src/Association/Statuts.md
Normal file
|
@ -0,0 +1,126 @@
|
|||
### Article 1. Constitution et dénomination
|
||||
|
||||
Il est fondé entre les adhérents aux présents statuts une association
|
||||
régie par la loi 1901, ayant pour titre Deuxfleurs.
|
||||
|
||||
### Article 2. Buts
|
||||
|
||||
Cette association a pour but de défendre et promouvoir les libertés
|
||||
individuelles et collectives à travers la mise en place d'infrastuctures
|
||||
numériques libres.
|
||||
|
||||
### Article 3. Siège social
|
||||
|
||||
Le siège social est fixé au 10A, Allée de Lanvaux, 35700 Rennes. Il
|
||||
pourra être transféré suite à un vote par l'assemblée générale.
|
||||
|
||||
### Article 4. Durée de l'association
|
||||
|
||||
L'association perdure tant qu'elle possède au moins un membre, ou
|
||||
jusqu'à sa dissolution décidée en assemblée générale.
|
||||
|
||||
<a name="article-admission" />
|
||||
|
||||
### Article 5. Admission et adhésion
|
||||
|
||||
Pour faire partie de l'association, il faut être coopté par un membre de
|
||||
l'association, adhérer aux présents statuts et s'acquitter de la
|
||||
cotisation annuelle dont le montant est de 10 euros.
|
||||
|
||||
### Article 6. Composition de l'association
|
||||
|
||||
L'association se compose exclusivement de membres admis selon les dispositions
|
||||
de l'[Article 5](#article-admission) et à jour de leur cotisation. Tout membre
|
||||
actif possède une voix lors des votes en assemblée générale. Est considéré
|
||||
actif tout membre présent à l'assemblée générale (physiquement, par
|
||||
visioconférence ou par procuration écrite donnée à un autre membre de
|
||||
l'association).
|
||||
|
||||
### Article 7. Perte de la qualité de membre
|
||||
|
||||
La qualité de membre se perd par :
|
||||
|
||||
- la démission,
|
||||
- le non-renouvelement de la cotisation dans un délai de deux mois
|
||||
après le 1er Janvier de l'année courante,
|
||||
- le décès,
|
||||
- la radiation prononcée aux deux tiers des votes exprimés, lors d'un
|
||||
vote extraordinaire ou de l'assemblée générale.
|
||||
|
||||
<a name="article-ag" />
|
||||
|
||||
### Article 8. L'assemblée générale
|
||||
|
||||
L'assemblée générale ordinaire se réunit au moins une fois par an, convoquée
|
||||
par le conseil d'administration. L'assemblée générale extraordinaire est
|
||||
convoquée par le conseil d'administration, à la demande de celui-ci ou à la
|
||||
demande du quart au moins des membres de l'association.
|
||||
|
||||
L'assemblée générale (ordinaire ou extraordinaire) comprend tous les
|
||||
membres de l'association à jour de leur cotisation. Quinze jours au
|
||||
moins avant la date fixée, les membres de l'association sont convoqués
|
||||
via la liste de diffusion de l'association et l'ordre du jour est
|
||||
inscrit sur les convocations.
|
||||
|
||||
Le conseil d'administration anime l'assemblée générale. L'assemblée
|
||||
générale, après avoir délibéré, se prononce sur le rapport moral et/ou
|
||||
d'activités. Le conseil d'administration rend compte de l'exercice
|
||||
financier clos et soumet le bilan de l'exercice clos à l'approbation de
|
||||
l'assemblée dans un délai de six mois après la clôture des comptes.
|
||||
L'assemblée générale délibère sur les orientations à venir et se
|
||||
prononce sur le budget prévisionnel de l'année en cours.
|
||||
|
||||
Elle pourvoit, au scrutin secret, à la nomination ou au renouvellement
|
||||
des membres du conseil d'administration via un scrutin de Condorcet
|
||||
Randomisé. Elle fixe le montant de la cotisation annuelle. Les décisions
|
||||
de l'assemblée sont prises à la majorité des membres présents ou
|
||||
représentés. Chaque membre présent ne peut détenir plus d'une
|
||||
procuration.
|
||||
|
||||
### Article 9. Membres mineurs
|
||||
|
||||
Les mineurs peuvent adhérer à l'association sous réserve d'un accord
|
||||
tacite ou d'une autorisation écrite de leurs parents ou tuteurs légaux.
|
||||
Ils sont membres à part entière de l'association. Seuls les membres âgés
|
||||
de 16 ans au moins au jour d'une élection sont autorisés à y voter,
|
||||
notamment au cours d'une assemblée générale. Pour les autres, leur droit
|
||||
de vote est transmis à leur représentant légal.
|
||||
|
||||
### Article 10. Le conseil d'administration
|
||||
|
||||
L'association est administrée par un conseil d'administration composé de
|
||||
3 à 6 membres, élus pour 1 an dans les conditions fixées à
|
||||
l'[Article 8](#article-ag). Tous les membres de l'association à jour de
|
||||
leur cotisation sont éligibles. En cas de vacance de poste, le conseil
|
||||
d'administration peut pourvoir provisoirement au remplacement de ses
|
||||
membres. Ce remplacement est obligatoire quand le conseil
|
||||
d'administration compte moins de 3 membres. Il est procédé à leur
|
||||
remplacement définitif à la plus prochaine assemblée générale. Les
|
||||
pouvoirs des membres ainsi élus prennent fin à l'époque où devrait
|
||||
normalement expirer le mandat des membres remplacés.
|
||||
|
||||
Le conseil d'administration met en œuvre les décisions de l'assemblée
|
||||
générale, organise et anime la vie de l'association, dans le cadre fixé
|
||||
par les statuts. Chacun de ses membres peut être habilité par le conseil
|
||||
à remplir toutes les formalités de déclaration et de publication
|
||||
prescrites par la législation et tout autre acte nécessaire au
|
||||
fonctionnement de l'association et décidé par le conseil
|
||||
d'administration. Tous les membres du conseil d'administration sont
|
||||
responsables des engagements contractés par l'association. Tout contrat
|
||||
ou convention passé entre l'association d'une part, et un membre du
|
||||
conseil d'administration, son conjoint ou un proche, d'autre part, est
|
||||
soumis pour autorisation au conseil d'administration et présenté pour
|
||||
information à la plus prochaine assemblée générale. Le conseil
|
||||
d'administration se réunit au moins 4 fois par an et toutes les fois
|
||||
qu'il est convoqué par le tiers de ses membres. La présence de la moitié
|
||||
au moins des membres du conseil est nécessaire pour que le conseil
|
||||
d'administration puisse délibérer valablement. Les décisions sont prises
|
||||
au consensus et, à défaut, à la majorité des voix des présents. Le vote
|
||||
par procuration n'est pas autorisé.
|
||||
|
||||
### Article 11. Modification des statuts de l'association
|
||||
|
||||
Sur demande d'un tiers des membres actifs, ou sur demande du conseil
|
||||
d'administration, des amendements aux statuts de l'association peuvent
|
||||
être discutés et soumis au vote lors d'une assemblée générale, selon les
|
||||
modalités de l'[Article 8](#article-ag).
|
51
src/Association/index.md
Normal file
|
@ -0,0 +1,51 @@
|
|||
### Notre raison d'être
|
||||
|
||||
Aujourd'hui, de grandes entreprises conçoivent des services numériques qui ont
|
||||
pour objectif de
|
||||
<a href="https://fr.wikipedia.org/wiki/%C3%89conomie_de_l%27attention">maximiser le temps</a>
|
||||
que nous passons dessus, de
|
||||
<a href="https://fr.wikipedia.org/wiki/%C3%89conomie_de_la_surveillance">collecter et recouper des données</a>
|
||||
à notre insu pour nous influencer, de
|
||||
<a href="https://www.april.org/le-parlement-europeen-valide-la-generalisation-de-la-censure-automatisee">limiter nos possibilités d'expression</a>
|
||||
au-delà du cadre légal et de
|
||||
<a href="https://fr.wikipedia.org/wiki/Embrace,_extend_and_extinguish">créer de nouveaux monopoles</a>.
|
||||
Ces effets nous montrent que la technologie n'est pas
|
||||
neutre et a un réel impact sur nos vies. En choisissant et en hébergeant nos
|
||||
propres outils de communication, sans but lucratif ni hégémonique, nous
|
||||
espérons nous affranchir de ces nuisances et préserver nos libertés.
|
||||
|
||||
Pour en savoir plus, rendez-vous sur
|
||||
<a href="https://www.laquadrature.net/">La Quadrature du Net</a>
|
||||
et allez lire le manifeste <a href="https://chatons.org/fr/manifeste">des CHATONS</a>.
|
||||
|
||||
### Nos objectifs
|
||||
|
||||
#### Des utilisateurs impliqués
|
||||
|
||||
Que ce soit à l'école, par l'expérimentation, via un forum d'échange, lors d'un
|
||||
atelier, via une publicité à la télévision, un tutoriel, lors d'une discussion
|
||||
avec un ami, il y a toujours une phase d'apprentissage en informatique.
|
||||
Malheureusement, dans ces conditions, dur de lutter pour des services libres
|
||||
face à la puissance de frappe d'une entreprise et des logiciels ayant une base
|
||||
d'utilisateurs immense. Nous pensons donc qu'une personne souhaitant s'héberger
|
||||
chez un hébergeur indépendant a besoin d'un accompagnement. C'est pourquoi les
|
||||
inscriptions se font par cooptation. La cooptation permet aussi un lien de
|
||||
confiance et ainsi de se prémunir de bon nombres d'attaques que subissent les
|
||||
hébergeurs.
|
||||
|
||||
#### Une architecture résiliente
|
||||
|
||||
Les sites webs, les réseaux sociaux, les emails ne peuvent fonctionner que
|
||||
grâce à des ordinateurs qui restent allumés 24/24h et qui n'attendent que vous.
|
||||
Cependant, ces derniers sont faillibles. Une coupure d'électricité, un disque
|
||||
dur cassé, une mise à jour ratée, un bug dans le logiciel, les raisons ne
|
||||
manquent pas. Heureusement, il est possible de masquer ces pannes avec du
|
||||
logiciel astucieusement conçu. C'est pourquoi vous avez l'impression que Google
|
||||
est toujours disponible, que Dropbox ne perd pas vos données, etc. La gestion
|
||||
de ces pannes, c'est aussi ce qui rend la vie compliquée aux hébergeurs
|
||||
indépendants. Entre incompréhension des utilisateurs quand un service est hors
|
||||
ligne et sueurs froides pour les administrateurs, ça n'a rien de marrant. Et
|
||||
c'est très chronophage. Notre objectif est donc de construire des solutions
|
||||
d'hébergements qui peuvent résister à ces pannes.
|
||||
|
||||
<p class="center"><a href="/Technique/">En savoir plus sur l'aspect technique</a></p>
|
BIN
src/Guide/Assets/riot_connect1.png
Normal file
After Width: | Height: | Size: 491 KiB |
BIN
src/Guide/Assets/riot_connect2.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
src/Guide/Assets/riot_connect25.png
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
src/Guide/Assets/riot_connect3.png
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
src/Guide/Assets/riot_connect4.png
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
src/Guide/Assets/riot_connect5.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
src/Guide/Assets/riot_install1.png
Normal file
After Width: | Height: | Size: 565 KiB |
BIN
src/Guide/Assets/riot_install2.png
Normal file
After Width: | Height: | Size: 1,013 KiB |
BIN
src/Guide/Assets/riot_install3.png
Normal file
After Width: | Height: | Size: 116 KiB |
BIN
src/Guide/Assets/riot_install4.png
Normal file
After Width: | Height: | Size: 523 KiB |
BIN
src/Guide/Assets/riot_install5.png
Normal file
After Width: | Height: | Size: 392 KiB |
43
src/Guide/Discussion.pug
Normal file
|
@ -0,0 +1,43 @@
|
|||
extends ../_layout.pug
|
||||
|
||||
prepend root
|
||||
- title = "Discussions"
|
||||
|
||||
|
||||
block content
|
||||
.spacing
|
||||
p Pour discuter entre nous, nous utilisons le réseau <a href="https://matrix.org/">Matrix</a>. C'est un réseau de discussion instantanée libre, et qui fonctionne très bien. Le logiciel <a href="https://riot.im">Riot</a> est le client, c'est à dire l'application qu'on utilise pour se connecter à Matrix.
|
||||
|
||||
|
||||
h2 Accès rapide à Riot
|
||||
|
||||
section
|
||||
a.service-box.left(href='https://riot.deuxfleurs.fr')
|
||||
div(style='font-size: 80px; height: 120px') 🌐
|
||||
h5 Accéder via le navigateur
|
||||
a.service-box.left(href='https://play.google.com/store/apps/details?id=im.vector.app&hl=fr')
|
||||
div(style='font-size: 80px; height: 120px') 📥
|
||||
h5 Application Android
|
||||
a.service-box.left(href='https://apps.apple.com/fr/app/riot-im/id1083446067')
|
||||
div(style='font-size: 80px; height: 120px') 📥
|
||||
h5 Application iOS
|
||||
|
||||
h2 Guide d'utilisation sur ordinateur
|
||||
|
||||
p Adrien a écrit un <a href="https://zinz.dev">guide d'installation/utilisation du résau Matrix</a> qui devrait vous aider à vous lancer. À l'inscription, remplacez <code>zinz.dev</code> par <code>im.deuxfleurs.fr</code> si vous souhaitez vous inscrire sur le serveur de l'asso.
|
||||
|
||||
h2 Premiers pas sur Android
|
||||
|
||||
.screenlist
|
||||
img(src="Assets/riot_install4.png", height="400")
|
||||
img(src="Assets/riot_install5.png", height="400")
|
||||
img(src="Assets/riot_connect2.png", height="400")
|
||||
img(src="Assets/riot_connect25.png", height="400")
|
||||
img(src="Assets/riot_connect3.png", height="400")
|
||||
img(src="Assets/riot_connect4.png", height="400")
|
||||
img(src="Assets/riot_connect5.png", height="400")
|
||||
|
||||
style.
|
||||
.screenlist > img {
|
||||
padding: 20px;
|
||||
}
|
20
src/Guide/Sites web.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
# Hébergement de sites web
|
||||
|
||||
Vous en avez marre de faire toute votre communication associative via Facebook ? Vous voulez créer votre propre site pour raconter votre dernier road-trip ou publier vos poèmes ? Vous ne savez pas vous y prendre ? Deuxfleurs est là pour vous !
|
||||
|
||||
Nous vous prodiguerons conseil, guidance, et hébergement pour que vos plus belles lignes soient disponibles en ligne dans les meilleures conditions. **Vous n'avez qu'à nous contacter à coucou<img class="simple" src="/img/arobase.png" height="15"/>deuxfleurs.fr**.
|
||||
|
||||
## Plus en détail
|
||||
|
||||
Nous hébergeons gratuitement les sites dont l'adresse web ressemble à `monbeausite.deuxfleurs.fr`. Si vous souhaitez votre propre nom de domaine (par exemple `monbeausite.fr`), la location du nom de domaine sera à votre charge (~15-20€/an).
|
||||
|
||||
Nous sommes compétents pour installer des sites fonctionnant avec [Wordpress](https://fr.wordpress.org/). C'est un système de gestion de contenu ([CMS](https://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_contenu) en anglais) qui permet de construire et d'administrer un site Internet *facilement et sans connaissances préalables*. Si Wordpress ne vous convient pas, on déterminera ensemble une solution adaptée à vos besoins et envies.
|
||||
|
||||
Nous assurons enfin la gestion de **sauvegardes de données** : en hébergeant vos données chez nous, vous avez la certitude de ne pas tout perdre en cas de pépin (tel que le décès prématuré d'un disque dur).
|
||||
|
||||
## En conclusion
|
||||
|
||||
Venez chez nous ! On vous fera un havre numérique aux petits oignons. Aider Internet à retrouver sa diversité d'antan, c'est important pour nous. On veut voir des blogs en pagaille, des réseaux sociaux délaissés, des thèmes loufoques et la mort de l'uniformisation graphique.
|
||||
|
||||
À terme, on demandera (sans doute) de s'inscrire à l'association pour être hébergé, mais pour le moment c'est gratuit et ouvert à tou.te.s, profitez-en !
|
||||
|
88
src/Guide/Visioconférence.pug
Normal file
|
@ -0,0 +1,88 @@
|
|||
extends ../_layout.pug
|
||||
|
||||
prepend root
|
||||
- title = "Visioconférence"
|
||||
|
||||
|
||||
block content
|
||||
.spacing
|
||||
h2 Rejoindre une réunion
|
||||
.spacing
|
||||
p Veuillez entrer le nom de la réunion que vous souhaitez rejoindre :
|
||||
input#joinname(type="text", placeholder="Nom de la réunion")
|
||||
a.button#joinbtn(href="#") rejoindre
|
||||
p
|
||||
| Le lien d'accès rapide à cette conférence est
|
||||
|
|
||||
a#joinlink
|
||||
|
||||
|
||||
|
||||
.spacing2
|
||||
h2 Guide de préparation d'une réunion
|
||||
|
||||
h3.spacing Étape 1 : Choisissez un nom de réunion (par exemple : "karaté-lyon")
|
||||
h3 Étape 2 : Informez vos participants de la date de votre réunion et du nom de la réunion
|
||||
h3
|
||||
| Étape 3 : Au moment voulu, pour rejoindre la conversation, les participants devront se rendre sur le site
|
||||
|
|
||||
a(href="https://deuxfleurs.fr") deuxfleurs.fr
|
||||
h3 Étape 4 : Puis, une fois sur la page d'accueil, cliquer sur le bouton "📞 visioconférence" (pour arriver sur cette page)
|
||||
h3 Étape 5 : Enfin, les participants doivent entrer le nom de la réunion (par exemple : "karaté-lyon") et cliquer sur "rejoindre"
|
||||
h3 Étape 6 : La conférence commence
|
||||
p Si vous êtes sur téléphone ou tablette, vous devrez cliquez sur "Download the app" pour installer l'app "Jitsi Meet" la première fois et les fois suivantes sur "Continue to the app" avant de pouvoir commencer la conférence.
|
||||
p Si vous êtes sur un ordinateur et que vous utilisez Mozilla Firefox, vous allez rencontrer un message d'erreur comme quoi votre navigateur n'est pas encore supporté.<br/>En attendant, vous pouvez installer <a href="https://brave.com/">Brave</a> ou <a href="https://www.google.com/intl/fr_fr/chrome/">Google Chrome</a> (nous déplorons cette situation, <a href="https://www.nextinpact.com/brief/videoconferences---firefox-et-jitsi-travaillent-a-un-meilleur-support-11906.htm">explications</a>).
|
||||
|
||||
.spacing2
|
||||
h2 Conseils pour réussir votre réunion
|
||||
|
||||
h3.spacing Bien se préparer
|
||||
p Vous pouvez rejoindre une réunion n'importe quand. Vous pouvez donc tester les étapes du "guide de préparation" en avance !
|
||||
|
||||
h3.spacing Bien s'entendre pendant la réunion
|
||||
|
||||
p "Tu m'entends ? Non pas très bien ! Qu'est ce que tu viens de dire ?" : quelques conseils pour bien s'entendre pour éviter ça et passer un bon moment.
|
||||
|
||||
p
|
||||
strong Améliorez le son :
|
||||
|
|
||||
| l'idéal est d'avoir un casque avec microphone ou des écouteurs avec microphone pour capter le son au plus près de votre bouche et empêcher l'écho (que votre microphone capte ce qui sort sur les hauts parleurs). Si vous n'avez pas de casques ou d'écouteurs ou que vous êtes plusieurs, les ordinateurs portables récents captent mieux le son que les anciens, et généralement votre téléphone captera mieux le son que votre ordinateur. De plus, si vous êtes plusieurs, vous devez savoir que les microphones sont directifs : si vous êtes proches et bien en face de l'ordinateur, on vous entendra bien, sinon on ne vous entendra pas du tout ! En groupe, tournez l'ordinateur vers la personne qui parle ou mettez-vous bien en face pour parler !
|
||||
|
||||
p
|
||||
strong Améliorez votre connexion :
|
||||
|
|
||||
| la visioconférence est très sensible à la qualité de votre connexion internet. Si vous le pouvez, connectez votre ordinateur en filaire (cable ethernet) à votre <em>box</em> (routeur internet). Si vous souhaitez rester en sans-fil (wifi), essayez de vous rapprocher de votre <em>box</em>. Le type de connexion internet influencera également la qualité de votre visioconférence : la fibre est idéale, l'ADSL ou les réseaux mobiles (4G et 3G) sont plus incertains.
|
||||
|
||||
p
|
||||
strong Réduisez vos usages :
|
||||
|
|
||||
| Activer la vidéo peut causer des interruptions ou dégrader la qualité du son. Si vous n'avez pas besoin de la vidéo, désactivez là ou garder là seulement pour certains participants. Si vous ne parlez pas, vous pouvez également couper votre microphone. Il est possible de passer en mode "talkie walkie" sur ordinateur avec la touche espace. Vous maintenez la touche espace, votre micro est activé. Vous arrêtez d'appuyer sur la touche espace, votre micro est coupé.
|
||||
|
||||
p Si vous appliquez ces conseils, vous devriez arriver à communiquer sans peine. Bonnes communications !
|
||||
|
||||
script.
|
||||
(_ => {
|
||||
const base_url = 'https://jitsi.deuxfleurs.fr/'
|
||||
const get_meeting_id = raw => raw.replace( /[^a-zA-Z0-9]/gi, '')
|
||||
const get_meeting_url = raw => base_url + get_meeting_id(raw)
|
||||
const joinbtn = document.getElementById('joinbtn')
|
||||
const joinname = document.getElementById('joinname')
|
||||
const joinlink = document.getElementById('joinlink')
|
||||
|
||||
window.addEventListener('pageshow', e => {
|
||||
joinbtn.text = "rejoindre"
|
||||
})
|
||||
|
||||
joinbtn.onclick = _ => {
|
||||
const meetingid = joinname.value
|
||||
if (!meetingid) return // meetingid is empty
|
||||
window.location.href = get_meeting_url(meetingid)
|
||||
joinbtn.text = "chargement..."
|
||||
}
|
||||
|
||||
joinname.addEventListener('input', v => {
|
||||
const l = v.target.value ? get_meeting_url(v.target.value) : ""
|
||||
joinlink.textContent = l
|
||||
joinlink.href = l
|
||||
})
|
||||
})()
|
8
src/Technique/Développement/Bottin.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Bottin
|
||||
|
||||
Bottin est un annuaire LDAP distribué développé en Go visant la simplicité d'installation et d'utilisation (comparé à des solutions comme OpenLDAP ou Keycloak) tout en offrant la résilience que l'on peut attendre d'un système d'authentification. Il se base pour le stockage distribué sur [Consul](https://www.consul.io/).
|
||||
|
||||
## Statut du développement
|
||||
|
||||
Bottin est actuellement utilisé en production pour deuxfleurs. Il est cependant toujours en développement actif.
|
||||
Le code de Bottin se trouve ici : https://git.deuxfleurs.fr/Deuxfleurs/bottin
|
1
src/Technique/Développement/Diplonat.md
Normal file
|
@ -0,0 +1 @@
|
|||
Le code est ici : https://git.deuxfleurs.fr/Deuxfleurs/diplonat
|
227
src/Technique/Développement/Garage.md
Normal file
|
@ -0,0 +1,227 @@
|
|||
# Garage: a S3-like object storage
|
||||
|
||||
Store pile of bytes in your garage.
|
||||
|
||||
## Context
|
||||
|
||||
Data storage is critical: it can lead to data loss if done badly and/or on hardware failure.
|
||||
Filesystems + RAID can help on a single machine but a machine failure can put the whole storage offline.
|
||||
Moreover, it put a hard limit on scalability. Often this limit can be pushed back far away by buying expensive machines.
|
||||
But here we consider non specialized off the shelf machines that can be as low powered and subject to failures as a raspberry pi.
|
||||
|
||||
Distributed storage may help to solve both availability and scalability problems on these machines.
|
||||
Many solutions were proposed, they can be categorized as block storage, file storage and object storage depending on the abstraction they provide.
|
||||
|
||||
## Related work
|
||||
|
||||
Block storage is the most low level one, it's like exposing your raw hard drive over the network.
|
||||
It requires very low latencies and stable network, that are often dedicated.
|
||||
However it provides disk devices that can be manipulated by the operating system with the less constraints: it can be partitioned with any filesystem, meaning that it supports even the most exotic features.
|
||||
We can cite [iSCSI](https://en.wikipedia.org/wiki/ISCSI) or [Fibre Channel](https://en.wikipedia.org/wiki/Fibre_Channel).
|
||||
Openstack Cinder proxy previous solution to provide an uniform API.
|
||||
|
||||
File storage provides a higher abstraction, they are one filesystem among others, which means they don't necessarily have all the exotic features of every filesystem.
|
||||
Often, they relax some POSIX constraints while many applications will still be compatible without any modification.
|
||||
As an example, we are able to run MariaDB (very slowly) over GlusterFS...
|
||||
We can also mention CephFS (read [RADOS](https://ceph.com/wp-content/uploads/2016/08/weil-rados-pdsw07.pdf) whitepaper), Lustre, LizardFS, MooseFS, etc.
|
||||
OpenStack Manila proxy previous solutions to provide an uniform API.
|
||||
|
||||
Finally object storages provide the highest level abstraction.
|
||||
They are the testimony that the POSIX filesystem API is not adapted to distributed filesystems.
|
||||
Especially, the strong concistency has been dropped in favor of eventual consistency which is way more convenient and powerful in presence of high latencies and unreliability.
|
||||
We often read about S3 that pioneered the concept that it's a filesystem for the WAN.
|
||||
Applications must be adapted to work for the desired object storage service.
|
||||
Today, the S3 HTTP REST API acts as a standard in the industry.
|
||||
However, Amazon S3 source code is not open but alternatives were proposed.
|
||||
We identified Minio, Pithos, Swift and Ceph.
|
||||
Minio/Ceph enforces a total order, so properties similar to a (relaxed) filesystem.
|
||||
Swift and Pithos are probably the most similar to AWS S3 with their consistent hashing ring.
|
||||
|
||||
There was many attempts in research too. I am only thinking to [LBFS](https://pdos.csail.mit.edu/papers/lbfs:sosp01/lbfs.pdf) that was used as a basis for Seafile.
|
||||
|
||||
- Cassandra (ScyllaDB) for metadata
|
||||
- Own system using consistent hashing for data chunks
|
||||
|
||||
**Quentin:**
|
||||
|
||||
- pas d'erasure coding mais des checksums à côté des fichiers (ou dans les meta données)
|
||||
- 2 ou 3 copies, configurable, potentiellement on a per bucket or per file basis
|
||||
- on ne setup pas à la main en effet, je pensais au système qui scan sa partition de stockage et qui fait stockage géré = min(stockage de la partition - stockage que je ne gère pas, stockage alloué)
|
||||
- La DHT/Ring à la dynamo, on doit pouvoir repomper un millier de truc sur leur papier. Surtout que je me le suis déja cogné deux fois. Le nombre d'entrées que tu mets est un multiple de ton stockage. eg: 500 Go, on fait des tranches de 10 Go --> 50 entrées dans le ring.
|
||||
- un protocole de maintenance pompé sur le papier dynamo avec de l'anti entropy qui vérifie les blobs et leurs checksums (en plus de la vérification réalisée à la lecture)
|
||||
- une interface web qui te donne en presque direct la santé de ton cluster (noeuds en vie, états de la réplication des données, problèmes de checksums)
|
||||
|
||||
**Other ideas:**
|
||||
|
||||
- split objects in constant size blocks or use the SeaFile strategy for better de-duplication? (Content Defined Chunking, Rabin's algorithm etc)
|
||||
|
||||
_Remark 1_ I really like the Rabin fingerprinting approach however deduplication means we need to implement reference counting. How do we implement it? If we suppose a CRDT counter, if we do +1, +1, -1 but counter is registered as +1, -1, +1, we are at zero at one point and lost ou chunk. ---> we need to be careful in our implementation if we want to play.
|
||||
|
||||
_Remark 2_ Seafile idea has been stolen from this article: https://pdos.csail.mit.edu/papers/lbfs:sosp01/lbfs.pdf
|
||||
|
||||
#### Random notes
|
||||
|
||||
--> we should not talk about block. It is the abstraction that manipulate your FS to interact with your hard drive. "Chunk" is probably more appropriate. Block storage are a class of distributed storage where you expose the abstraction of your hard drive over the network, mainly SATA over ethernet, thinking to SCSI, FiberChannel, and so on
|
||||
|
||||
### Questions à résoudre
|
||||
|
||||
1. est-ce que cassandra support de mettre certaines tables sur un SSD et d'autres sur un disque rotatif ?
|
||||
2. est-ce que cassandra/scylladb a un format de table on disk qui ne s'écroule pas complètement losque tu as des gros blobs ? (les devs de sqlite ont écrit tout un article pour dire que même avec leur lib qui est quand même sacrément optimisés, ils considèrent qu'à partir de je crois 4ko c'est plus efficace de mettre les blobs dans des fichiers séparés) - https://www.sqlite.org/intern-v-extern-blob.html
|
||||
3. Quelle taille de blocs ? L'idée c'est qu'on a quand même des liens en WAN avec des débits pas forcéments incroyables. Et ça serait bien que le temps de répliquer un bloc soit de l'ordre de la seconde maxi. En cas de retry, pour pouvoir mieux monitorer la progression, etc. Exoscale utilise 16Mo. LX propose 1Mo.
|
||||
|
||||
#### Modules
|
||||
|
||||
- `membership/`: configuration, membership management (gossip of node's presence and status), ring generation --> what about Serf (used by Consul/Nomad) : https://www.serf.io/? Seems a huge library with many features so maybe overkill/hard to integrate
|
||||
- `metadata/`: metadata management
|
||||
- `blocks/`: block management, writing, GC and rebalancing
|
||||
- `internal/`: server to server communication (HTTP server and client that reuses connections, TLS if we want, etc)
|
||||
- `api/`: S3 API
|
||||
- `web/`: web management interface
|
||||
|
||||
#### Metadata tables
|
||||
|
||||
**Objects:**
|
||||
|
||||
- *Hash key:* Bucket name (string)
|
||||
- *Sort key:* Object key (string)
|
||||
- *Sort key:* Version timestamp (int)
|
||||
- *Sort key:* Version UUID (string)
|
||||
- Complete: bool
|
||||
- Inline: bool, true for objects < threshold (say 1024)
|
||||
- Object size (int)
|
||||
- Mime type (string)
|
||||
- Data for inlined objects (blob)
|
||||
- Hash of first block otherwise (string)
|
||||
|
||||
*Having only a hash key on the bucket name will lead to storing all file entries of this table for a specific bucket on a single node. At the same time, it is the only way I see to rapidly being able to list all bucket entries...*
|
||||
|
||||
**Blocks:**
|
||||
|
||||
- *Hash key:* Version UUID (string)
|
||||
- *Sort key:* Offset of block in total file (int)
|
||||
- Hash of data block (string)
|
||||
|
||||
A version is defined by the existence of at least one entry in the blocks table for a certain version UUID.
|
||||
We must keep the following invariant: if a version exists in the blocks table, it has to be referenced in the objects table.
|
||||
We explicitly manage concurrent versions of an object: the version timestamp and version UUID columns are index columns, thus we may have several concurrent versions of an object.
|
||||
Important: before deleting an older version from the objects table, we must make sure that we did a successfull delete of the blocks of that version from the blocks table.
|
||||
|
||||
Thus, the workflow for reading an object is as follows:
|
||||
|
||||
1. Check permissions (LDAP)
|
||||
2. Read entry in object table. If data is inline, we have its data, stop here.
|
||||
-> if several versions, take newest one and launch deletion of old ones in background
|
||||
3. Read first block from cluster. If size <= 1 block, stop here.
|
||||
4. Simultaneously with previous step, if size > 1 block: query the Blocks table for the IDs of the next blocks
|
||||
5. Read subsequent blocks from cluster
|
||||
|
||||
Workflow for PUT:
|
||||
|
||||
1. Check write permission (LDAP)
|
||||
2. Select a new version UUID
|
||||
3. Write a preliminary entry for the new version in the objects table with complete = false
|
||||
4. Send blocks to cluster and write entries in the blocks table
|
||||
5. Update the version with complete = true and all of the accurate information (size, etc)
|
||||
6. Return success to the user
|
||||
7. Launch a background job to check and delete older versions
|
||||
|
||||
Workflow for DELETE:
|
||||
|
||||
1. Check write permission (LDAP)
|
||||
2. Get current version (or versions) in object table
|
||||
3. Do the deletion of those versions NOT IN A BACKGROUND JOB THIS TIME
|
||||
4. Return succes to the user if we were able to delete blocks from the blocks table and entries from the object table
|
||||
|
||||
To delete a version:
|
||||
|
||||
1. List the blocks from Cassandra
|
||||
2. For each block, delete it from cluster. Don't care if some deletions fail, we can do GC.
|
||||
3. Delete all of the blocks from the blocks table
|
||||
4. Finally, delete the version from the objects table
|
||||
|
||||
Known issue: if someone is reading from a version that we want to delete and the object is big, the read might be interrupted. I think it is ok to leave it like this, we just cut the connection if data disappears during a read.
|
||||
|
||||
("Soit P un problème, on s'en fout est une solution à ce problème")
|
||||
|
||||
#### Block storage on disk
|
||||
|
||||
**Blocks themselves:**
|
||||
|
||||
- file path = /blobs/(first 3 hex digits of hash)/(rest of hash)
|
||||
|
||||
**Reverse index for GC & other block-level metadata:**
|
||||
|
||||
- file path = /meta/(first 3 hex digits of hash)/(rest of hash)
|
||||
- map block hash -> set of version UUIDs where it is referenced
|
||||
|
||||
Usefull metadata:
|
||||
|
||||
- list of versions that reference this block in the Casandra table, so that we can do GC by checking in Cassandra that the lines still exist
|
||||
- list of other nodes that we know have acknowledged a write of this block, usefull in the rebalancing algorithm
|
||||
|
||||
Write strategy: have a single thread that does all write IO so that it is serialized (or have several threads that manage independent parts of the hash space). When writing a blob, write it to a temporary file, close, then rename so that a concurrent read gets a consistent result (either not found or found with whole content).
|
||||
|
||||
Read strategy: the only read operation is get(hash) that returns either the data or not found (can do a corruption check as well and return corrupted state if it is the case). Can be done concurrently with writes.
|
||||
|
||||
**Internal API:**
|
||||
|
||||
- get(block hash) -> ok+data/not found/corrupted
|
||||
- put(block hash & data, version uuid + offset) -> ok/error
|
||||
- put with no data(block hash, version uuid + offset) -> ok/not found plz send data/error
|
||||
- delete(block hash, version uuid + offset) -> ok/error
|
||||
|
||||
GC: when last ref is deleted, delete block.
|
||||
Long GC procedure: check in Cassandra that version UUIDs still exist and references this block.
|
||||
|
||||
Rebalancing: takes as argument the list of newly added nodes.
|
||||
|
||||
- List all blocks that we have. For each block:
|
||||
- If it hits a newly introduced node, send it to them.
|
||||
Use put with no data first to check if it has to be sent to them already or not.
|
||||
Use a random listing order to avoid race conditions (they do no harm but we might have two nodes sending the same thing at the same time thus wasting time).
|
||||
- If it doesn't hit us anymore, delete it and its reference list.
|
||||
|
||||
Only one balancing can be running at a same time. It can be restarted at the beginning with new parameters.
|
||||
|
||||
#### Membership management
|
||||
|
||||
Two sets of nodes:
|
||||
|
||||
- set of nodes from which a ping was recently received, with status: number of stored blocks, request counters, error counters, GC%, rebalancing%
|
||||
(eviction from this set after say 30 seconds without ping)
|
||||
- set of nodes that are part of the system, explicitly modified by the operator using the web UI (persisted to disk),
|
||||
is a CRDT using a version number for the value of the whole set
|
||||
|
||||
Thus, three states for nodes:
|
||||
|
||||
- healthy: in both sets
|
||||
- missing: not pingable but part of desired cluster
|
||||
- unused/draining: currently present but not part of the desired cluster, empty = if contains nothing, draining = if still contains some blocks
|
||||
|
||||
Membership messages between nodes:
|
||||
|
||||
- ping with current state + hash of current membership info -> reply with same info
|
||||
- send&get back membership info (the ids of nodes that are in the two sets): used when no local membership change in a long time and membership info hash discrepancy detected with first message (passive membership fixing with full CRDT gossip)
|
||||
- inform of newly pingable node(s) -> no result, when receive new info repeat to all (reliable broadcast)
|
||||
- inform of operator membership change -> no result, when receive new info repeat to all (reliable broadcast)
|
||||
|
||||
Ring: generated from the desired set of nodes, however when doing read/writes on the ring, skip nodes that are known to be not pingable.
|
||||
The tokens are generated in a deterministic fashion from node IDs (hash of node id + token number from 1 to K).
|
||||
Number K of tokens per node: decided by the operator & stored in the operator's list of nodes CRDT. Default value proposal: with node status information also broadcast disk total size and free space, and propose a default number of tokens equal to 80%Free space / 10Gb. (this is all user interface)
|
||||
|
||||
|
||||
#### Constants
|
||||
|
||||
- Block size: around 1MB ? --> Exoscale use 16MB chunks
|
||||
- Number of tokens in the hash ring: one every 10Gb of allocated storage
|
||||
- Threshold for storing data directly in Cassandra objects table: 1kb bytes (maybe up to 4kb?)
|
||||
- Ping timeout (time after which a node is registered as unresponsive/missing): 30 seconds
|
||||
- Ping interval: 10 seconds
|
||||
- ??
|
||||
|
||||
#### Links
|
||||
|
||||
- CDC: <https://www.usenix.org/system/files/conference/atc16/atc16-paper-xia.pdf>
|
||||
- Erasure coding: <http://web.eecs.utk.edu/~jplank/plank/papers/CS-08-627.html>
|
||||
- [Openstack Storage Concepts](https://docs.openstack.org/arch-design/design-storage/design-storage-concepts.html)
|
||||
- [RADOS](https://ceph.com/wp-content/uploads/2016/08/weil-rados-pdsw07.pdf)
|
9
src/Technique/Développement/Guichet.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Guichet
|
||||
|
||||
Guichet est une interface de gestion utilisateur LDAP pour Bottin.
|
||||
Il vise notamment à permettre aux utilisateurs de modifier leurs identifinats ainsi que leurs données personnelles.
|
||||
|
||||
## Statut du développement
|
||||
|
||||
Guichet est actuellement utilisé en production pour deuxfleurs. Il est cependant toujours en développement actif.
|
||||
Le code est ici : https://git.deuxfleurs.fr/Deuxfleurs/guichet
|
49
src/Technique/Infra/Energie.md
Normal file
|
@ -0,0 +1,49 @@
|
|||
# Énergie
|
||||
|
||||
## Consommation énergétique
|
||||
|
||||
(Quentin, atuin.site) Durant l'épidémie SARS-COV-2, mon appartement était vide durant un mois.
|
||||
L'occasion d'estimer au plus près la consommation énergétique de mes composants à partir de la facture EDF.
|
||||
|
||||
Mes composants allumés durant ce mois :
|
||||
* Un réfrigérateur demi taille sous le plan de travail
|
||||
* Une freebox mini 4k
|
||||
* Un switch netgear
|
||||
* 3 Lenovo Thinkcentre M82
|
||||
|
||||
La facture d'avril 2020 me donne :
|
||||
* 87 kWh pour 23€
|
||||
|
||||
On rappelle `P = E / t`
|
||||
Sur un mois on a donc `P [en W] = E [en kWh] * 1000 / (30 [en jours] * 24 [en heures/jours])`
|
||||
Autrement dit : `P = E * 1.388889` et `E = P / 1.38889`
|
||||
|
||||
On estimera également à partir d'une recherche rapide sur interne que le réfrigérateur consomme environ 120 kWh par an, donc 10 kWh par mois.
|
||||
|
||||
Quelques déductions :
|
||||
* Prix du kWh : 0,26€
|
||||
* Énergie par mois dédiée pour deuxfleurs.fr : 77 kWh
|
||||
* Consommation instantanée équivalente : 106 W
|
||||
* Coût en électricité : 20€
|
||||
|
||||
Selon Maximilien, quelques puissances indicatives :
|
||||
* Un PC de bureau c'est entre 25 et 30 W
|
||||
* Son serveur Dell R710 c'est environ 100 W en *idle*
|
||||
* Un routeur haut de gamme c'est 13 W
|
||||
|
||||
Ces données sont bien cohérentes avec les résultats précédents.
|
||||
On peut estimer le coût en électricité de chacun de ces appareils au passage (considérant qu'ils restent allumés le mois entier) :
|
||||
* Un Dell R710 : 100W -> 19 €/mois
|
||||
* Une tour type Lenovo Thinkcentre M82 : 28 W -> 5,2 €/mois
|
||||
* Un routeur ou un switch : 10 W -> 1,9 €/mois
|
||||
|
||||
Pour continuer la réflexion, il serait intéressant d'étudier la consommation des serveurs à base ARM considérant notre charge.
|
||||
Cependant, avoir des tours semble être plus pertinent que des serveurs pro qui consomment toujours beaucoup comparés à une tour (bien que les performances ne soient pas comparables, bien entendu).
|
||||
Idéalement, avoir des mesures directement sur les équipement permettrait d'avoir des mesures plus solides et pouvoir mieux identifier les équipements énergivores.
|
||||
|
||||
**Moins cher dans un datacenter ?** - Scaleway et OVH proposent des VPS à des prix compétitifs (à partir de 3 €/mois). Mettre une vieille machine en auto-hébergement peut donc couter plus cher en électricité que louer une machine chez eux. En se focalisant seulement sur ces deux points, on pourrait identifier un point de bascule puissance/énergie à partir duquel il devient plus intéressant de s'auto-héberger que d'externaliser. Avec les Lenovo Thinkcentre M82 des machines qui ont 5 ans, on est à peine gagnant : pour 5€ d'électricité par mois, une machine équivalente en *bare metal* en location dans un datacenter coûte dans les 10€ à 15€. Mais même la, la différence de prix reste faible. Je vois deux explications :
|
||||
* du matériel qui consomme moins
|
||||
* de l'électricité moins chère.
|
||||
|
||||
**On consomme plus alors ?** - Pour avoir une approche écologique, il nous faudrait donc comparer la consommation des serveurs et non les prix finaux pratiqués par les hébergeurs. Et pour comparer le renouvellement du matériel, il faudrait comparer la consommation énergétique sur la durée de vie complète de l'appareil en y incluant **sa frabrication**.
|
||||
À mon avis le bilan écologique de l'auto-hébergement n'est pas pire qu'en datacenter et pourrait même être meilleur...
|
88
src/Technique/Infra/Internet.md
Normal file
|
@ -0,0 +1,88 @@
|
|||
Cette page regroupe un résumé de tous les problèmes que vous pourriez rencontrer en voulant faire de l'auto hébergement avec "votre connexion internet".
|
||||
|
||||
## Côté Opérateur
|
||||
|
||||
|
||||
### Congestion
|
||||
|
||||
#### Congestion sur la livraison
|
||||
|
||||
Entre janvier et mars, les serveurs hébergés derrière une connexion Free ont eu des problèmes en soirée.
|
||||
Le problème a été résolu depuis.
|
||||
|
||||
Plus d'informations ici : https://www.aduf.org/viewtopic.php?t=286599&start=0
|
||||
|
||||
#### Congestion liée au peering
|
||||
|
||||
*À compléter*
|
||||
|
||||
### Adressage
|
||||
|
||||
#### Pas d'IPv4 publique
|
||||
|
||||
Certains FAI ne donnent pas d'IPv4 publique du tout (même pas au niveau du routeur).
|
||||
À la place, ils mettent en place un NAT nommé carrier-grade NAT que vous ne pouvez pas configurer.
|
||||
Parfois, il suffit de les appels.
|
||||
|
||||
Exemple : Ora/Viti en Polynésie française
|
||||
|
||||
#### Pas d'IPv6 du tout
|
||||
|
||||
FAI connus pour ne pas proposer d'IPv6 :
|
||||
|
||||
* SFR/FTTH
|
||||
|
||||
#### IPv6 de mauvaisee qualité
|
||||
|
||||
*Ajouter des explications à propos du tunneling*
|
||||
|
||||
#### Adresse IP publique dynamique
|
||||
|
||||
FAI connus pour proposer une adresse IP publique dynamique :
|
||||
|
||||
* Orange/ADSL (rotation quotidienne et à chaque resynchro)
|
||||
* Orange/FTTH (rotation ~1 fois/mois)
|
||||
|
||||
### Autre
|
||||
|
||||
#### Blocage du port 25 en sortie (impossibilité d'héberger un serveur email)
|
||||
|
||||
* Débloquable chez Free/\* dans l'interface (gratuit)
|
||||
* Bloqué chez Orange/\* (sauf à passer sur une offre pro et encore...)
|
||||
* Débloqué chez SFR/FTTH
|
||||
* Débloqué chez Numéricable/Coaxial
|
||||
* Inconnu chez Bouygues/\*
|
||||
|
||||
#### Reverse DNS
|
||||
|
||||
*Expliquer pourquoi c'est utile*
|
||||
|
||||
* Orange : Ne propose pas de configurer le reverse
|
||||
* SFR : Inconnu, probablement que non
|
||||
* Numéricable : Inconnu, probablement que non
|
||||
* Bouygues : Inconnu, probablement que non
|
||||
* Free : Oui mais service cassé dans certains cas (récupérations d'IPv4)
|
||||
|
||||
## Chez vous
|
||||
|
||||
### Votre routeur ("box")
|
||||
|
||||
#### NAT hairpinning
|
||||
|
||||
Vous avez besoin du NAT hairpinning pour accéder aux services publics que vous proposez derrière un NAT depuis le réseau interne du serveur. Typiquement quand vous n'avez que de l'IPv4 et qu'une seule IP publique portée par votre routeur.
|
||||
|
||||
*Ajouter de la doc sur le NAT hairpinning*
|
||||
|
||||
Routeurs connus pour avoir des problèmes de NAT hairpinning :
|
||||
|
||||
* Orange : Probablement toutes les box
|
||||
* Livebox 2 Sagem
|
||||
* Livebox 4 Sagemcom
|
||||
* Bouygues : Suspicions sur toutes les box
|
||||
* Free : 100% OK
|
||||
* Numéricable : Inconnu
|
||||
* SFR : Inconnu
|
||||
|
||||
#### Problèmes de qualité du routeur
|
||||
|
||||
*À compléter*
|
BIN
src/Technique/Infra/img/fbx.jpg
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
src/Technique/Infra/img/lenovo.jpg
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
src/Technique/Infra/img/switch.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
82
src/Technique/Infra/index.md
Normal file
|
@ -0,0 +1,82 @@
|
|||
# Infrastructure
|
||||
|
||||
## Physique
|
||||
|
||||
Un site est constitué de l'ensemble du matériel à un lieu donné géré par une (ou plusieurs) personne donnée.
|
||||
Le lieu géographique peut évoluer dans le temps, comme par exemple lors d'un déménagement.
|
||||
Le nommage du site est donc arbitraire, nous recommandons le choix d'un corps céleste, tout aussi étrange soit-il.
|
||||
Ce découpage en sites est important pour certaines de nos applications.
|
||||
|
||||
### 🐢 atuin.site
|
||||
|
||||
Informations générales :
|
||||
|
||||
| Caractéristiques | Détails |
|
||||
| --: | :-- |
|
||||
| Administration | Alex et Quentin |
|
||||
| Hébergement | 🏡 Quentin |
|
||||
| Région | Bretagne |
|
||||
| FAI | Free - 1Gb/s, ✅ IPv4 publique, ✅ IPv4 fixe, ✅ IPv6 publique, ✅ IPv6 fixe, ✅ SMTP, ❌ Reverse DNS |
|
||||
|
||||
Liste du matériel :
|
||||
|
||||
| Désignation | Rôle | Quantité | Détails | Image |
|
||||
| -- | -- | -- | -- | -- |
|
||||
| Lenovo Thinkcentre M82 | Serveur | x3 | Intel G3420 @ 3.20GHz (2 coeurs), 8Go RAM, 128GB SSD, 1TB HDD | ![photo serveur](img/lenovo.jpg)
|
||||
| Netgear ?? | Switch | x1 | 24 ports @ 100 Mbit/s, 2 uplinks @ 1Gbit/s | ![photo switch](img/switch.jpg) |
|
||||
| Freebox Mini 4k | Routeur | x1 | 4 ports @ 1Gbit/s, WAN Fibre 1 Gbit/s symétrique |![photo freebox](img/fbx.jpg)
|
||||
|
||||
### ⚔️ mars.site
|
||||
|
||||
Informations générales :
|
||||
|
||||
| Caractéristiques | Détails |
|
||||
| --: | :-- |
|
||||
| Administration | Adrien (et Quentin) |
|
||||
| Hébergement | 🏢 Gandi |
|
||||
| Région | Île-de-France |
|
||||
| FAI | Gandi - ✅ IPv4 publique, ✅ IPv4 fixe, ❓ IPv6 publique, ❓ IPv6 fixe, ❓ SMTP, ❓ Reverse DNS |
|
||||
|
||||
Liste du matériel :
|
||||
|
||||
| Désignation | Rôle | Quantité | Détails | Image |
|
||||
| -- | -- | -- | -- | -- |
|
||||
| VPS | Serveur | x1 | 1 vCPU, 3Go RAM, 70 GB Block Storage | N/A |
|
||||
|
||||
### 🪐 saturne.site
|
||||
|
||||
Informations générales :
|
||||
|
||||
| Caractéristiques | Détails |
|
||||
| --: | :-- |
|
||||
| Administration | Alex |
|
||||
| Hébergement | 🏢 Kimsufi (filiale d'OVH) |
|
||||
| Région | Hauts-de-France |
|
||||
| FAI | OVH - ✅ IPv4 publique, ✅ IPv4 fixe, ✅ IPv6 publique, ✅ IPv6 fixe, ✅ SMTP, ✅ Reverse DNS |
|
||||
|
||||
Liste du matériel :
|
||||
|
||||
| Désignation | Rôle | Quantité | Détails | Image |
|
||||
| -- | -- | -- | -- | -- |
|
||||
| Kimsufi | Serveur | x1 | Intel Atom N2800 @ 1.86Ghz (4 coeurs), 4Go RAM, 2TB HDD, réseau 100Mbit/s | N/A |
|
||||
|
||||
### ✉️ mercure.site
|
||||
|
||||
Informations générales :
|
||||
|
||||
| Caractéristiques | Détails |
|
||||
| --: | :-- |
|
||||
| Administration | Quentin et Maximilien |
|
||||
| Hébergement | 🏡 Maximilien |
|
||||
| Région | Île-de-France |
|
||||
| FAI | Orange - ❌ IPv4 fixe, ❌ IPv4 publique, ❌ IPv6 fixe, ✅ IPv6 publique, ❌ SMTP, ❌ Reverse DNS |
|
||||
|
||||
Liste du matériel :
|
||||
|
||||
| Désignation | Rôle | Quantité | Détails | Image |
|
||||
| -- | -- | -- | -- | -- |
|
||||
| VPS | Serveur | x1 | 4 vCPU, 8Go RAM, 20 GB Block Storage | N/A |
|
||||
|
||||
## Réseau
|
||||
|
||||
## Logiciel
|
17
src/Technique/Jalon/CHATONS.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
Nous souhaiterions devenir un CHATON, pour ça il faudrait au moins :
|
||||
|
||||
- Avoir des backups sur les services "stables"
|
||||
- Avoir des performances satisfaisantes sur les services, actuellement ces services cochent les cases :
|
||||
- Jitsi
|
||||
- Riot/Matrix
|
||||
- CryptPad
|
||||
- Gitea
|
||||
- Avoir un modèle plus clair / écrire plus largement comment un membre peut nous rejoindre
|
||||
- Corriger les problèmes de robustesse simple de l'infrastructure :
|
||||
- Ordonancement des services au boot
|
||||
- Nomad démarre avant que le réseau soit prêt
|
||||
- Consul démarre avant que le réseau soit prêt
|
||||
- GlusterFS n'a pas démarré quand le fstab est lu, donc la partition n'est pas montée
|
||||
- Reconfiguration du NAT / des ports dans le firewall
|
||||
- En cours via le développement de Diplonat
|
||||
- Compléter cette liste en lisant la charte du site web des chatons
|
117
src/Technique/Jalon/Interconnexion.md
Normal file
|
@ -0,0 +1,117 @@
|
|||
# Interconnectons nos infrastructures
|
||||
|
||||
*Ce document est une "demande de commentaire". Amendez-le, modifiez-le, ajoutez vos réserves ou vos solutions alternatives librement.*
|
||||
|
||||
## Contexte
|
||||
|
||||
Nous avons une architecture type micro-services.
|
||||
Chaque service n'est pas attaché à une machine, il peut en changer pour mieux répartir la charge ou en cas d'incident.
|
||||
La plupart de ces services sont consommés en interne, leur adresse est découverte grâce au serveur DNS exposé par Consul. Ils ne sont donc pas exposés sur internet.
|
||||
Principe de minimisation de la surface d'attaque : consommé en interne donc pas de raison d'être disponible en externe.
|
||||
Qui plus est, la communication entre ces services se fait souvent en clair pour des raisons de simplicités.
|
||||
Ce n'est pas (trop) problématique, car le réseau interne n'est pas (supposé) surveillé.
|
||||
|
||||
## Problème
|
||||
|
||||
On ne peut pas consommer les services internes d'une infrastructure A depuis une infrastructure B.
|
||||
Par exemple, on voudrait que le serveur LDAP géré par Quentin soit consommable par le serveur Git géré par Adrien, avec ces propriétés :
|
||||
|
||||
* sans qu'il soit exposé directement sur internet,
|
||||
* sans que la communication entre A et B puisse être espionnée,
|
||||
* sans que le service soit "attaché" à une machine en particulier.
|
||||
|
||||
## Difficultés techniques
|
||||
|
||||
D'un point de vue topologie réseau, on a une première contrainte, le NAT en IPv4.
|
||||
En effet, si on a des serveurs derrière un même NAT ils auront envie de communiquer via l'IP interne.
|
||||
Mais les algos de gestion de membre (membership management) de Consul & co pourrait être empoisonné par ces IPs qui n'auraient que de valeur en interne.
|
||||
Après, on peut imaginer qu'on leur donne que l'IP externe pour communiquer, et se baser sur le NAT hairpinning de la box pour les communications intra cluster, mais ça rajoute une pression inutile sur la box : tout le traffic inter cluster sera rerouté et réécrit par la box, on se retrouve avec des traitements L3 inutiles.
|
||||
C'est particulièrement critique si on commence à faire du transfert de données (comme Garage par exemple).
|
||||
|
||||
## Être adressable sur Internet
|
||||
|
||||
Cette complexité devrait être évitée à mon avis. Pour cela je propose de baser nos communications de cluster via IPv6 seulement pour pouvoir adresser tout le monde directement. Je propose d'éditer un cahier des charges de la configuration minimale qu'une personne doit remplir pour s'interconnecter à l'infrastructure Deuxfleurs. Voilà une ébauche :
|
||||
|
||||
- Avoir une IPv6 routable sur Internet
|
||||
- Ne pas avoir de filtrage de port imposé par son fournisseur d'accès (exception possible pour le port 25 en sortie...)
|
||||
- Avoir au minimum 1Go de RAM
|
||||
- Avoir un processeur x86
|
||||
|
||||
## Trouver un service et chiffrer systématiquement
|
||||
|
||||
Maintenant que toutes les machines de toutes les infrastructures peuvent toutes communiquer entre elles, il nous reste encore deux problèmes :
|
||||
- Les services ne sont pas attachés à une machine, et donc pas attachés à une adresse réseau
|
||||
- Le trafic passant en clair sur internet est supposé espionné
|
||||
|
||||
Il nous faut donc deux propriétés qui découlent directement de ces deux besoins :
|
||||
- Un moyen de permettre à un service C de communiquer avec un service D
|
||||
- Chiffrer systématiquement le traffic qui part sur internet
|
||||
|
||||
Voici quelques solutions auxquelles je pense :
|
||||
|
||||
### La *low-tech* : TLS au niveau applicatif et Consul DNS en service discovery
|
||||
|
||||
Étant donné que toutes les machines sont adressables en IPv6, on pourrait imaginer continuer dans la lancée actuelle et enregistrer l'IPv6 publique plutôt que l'IPv4 privée. Il faudrait s'assurer que les applications fassent elles-mêmes le TLS au niveau applicatif. Mais ça voudrait dire que les services seraient exposés sur Internet en IPv6 et que notre seule protection serait le controle d'authentification réalisée par l'application (pour l'auth) et le TLS applicatif pas oublié (pour le chiffrement - et l'auth potentiellement en mutual auth).
|
||||
On pourrait imaginer upgrader ce modèle en rajoutant une règle IPv6 dans le firewall des serveurs pour autoriser le trafic IPv6 global qu'entre serveurs de l'infra. Et seuls les ports des services publics actuels seraient ouverts à tous en IPv6.
|
||||
|
||||
**Avantages:**
|
||||
|
||||
- Bye bye le NAT
|
||||
- Basé sur des protocoles standard
|
||||
- Conceptuellement "simple"
|
||||
|
||||
**Inconvénients:**
|
||||
|
||||
- Complexité de mise en place, car il faut s'assurer que **tous** les services internes du cluster utilisent une authentification et que celle-ci est bien configurée
|
||||
- Pas de défense en profondeur, donc il restera toujours le risque d'un service mal configuré qui permet de compromettre le système
|
||||
- Certains services ne savent peut-être pas faire d'authentification ? Par exemple GlusterFS (pour l'instant on ne s'en est pas débarassés) est-il capable de faire du TLS entre les noeuds ?
|
||||
- Si on choisit de rajouter un firewall, sait-on le configurer automatiquement lorsque les services changent de machine/de port ?
|
||||
|
||||
### La *networking* : Ajouter un VPN
|
||||
|
||||
Solution étudiée par TeDomum/ACID. Ils partent sur Wesher. Voici leur avis :
|
||||
|
||||
> On s'est posé la question d'utiliser un service mesh plutôt qu'un mesh d'infrastructure. Et il se trouve que ça collait peu à notre besoin. Il y a trop de choses au-dessus pas conçues pour être à poil sur internet et qui rentreraient pas dans le service mesh.
|
||||
>
|
||||
> Consul est top si tu veux interconnecter des clusters k8s dans des régions différentes. Mais si tu fais un cluster étendu y'a trop de choses exposées par défaut sans tls ou sans authent sur le réseau d'infra k8s. Et trop de choses dans plein de techno où il attend une forme de l2 partagé ou une proximité réseau, même virtuelle, comme les acl par préfixe IP dans les solutions de stockage, l'allocation de préfixe d'adressage dans les ipam de la plupart des cni, etc.
|
||||
>
|
||||
> On pourrait probablement s'en sortir en oubliant le cluster étendu géographique et en dégainant des solutions de synchro multi clusters avec plein de petits clusters et un service mesh par-dessus. Mais c'est beaucoup plus complexe de mise en oeuvre et beaucoup plus coûteux qu'un bon vieux vpn en dessous.
|
||||
>
|
||||
> Bref. On veut faire simple et efficace.
|
||||
|
||||
Solutions possibles: Wireguard/[Wesher](https://github.com/costela/wesher), `tinc`, cjdns/yggdrasil.
|
||||
|
||||
**Avantages:**
|
||||
|
||||
- Indépendant de toute autre problématique sur le cluster
|
||||
- Sans doute la solution la plus rapide à déployer à partir de l'état actuel
|
||||
- Les services continuent à se parler sur un réseau normal (cf les remarques de TeDomum ci-dessus)
|
||||
- Si les services communiquent en TLS et s'authentifie les uns aux autres ça fait une 2e couche de sécurité
|
||||
|
||||
**Inconvénient:**
|
||||
|
||||
- Ajoute un niveau de complexité au niveau global
|
||||
- N'implémente pas de politique de sécurité entre les services du cluster
|
||||
- Consommateur de CPU à haut débit
|
||||
- Protocoles de routage non-standard dans le cas des protocoles à base de mesh
|
||||
- (Certains clients VPN ne sont dispo que sur archi x86)
|
||||
|
||||
### La *micro-service architecture* : utiliser un service mesh
|
||||
|
||||
Consul Connect permet de reporter le problème de l'interconnexion des infrastructures non plus au niveau des applications mais au niveau du cluster. Une fois Consul et Consul Connect bien configuré, tout le trafic sera alors chiffré d'un micro service à un autre avec du TLS et de l'authentification mutuelle. Consul sera lui-même en charge de trouver comment faire communiquer les éléments.
|
||||
|
||||
**Avantages:**
|
||||
|
||||
- Solution bien intégrée avec les autres outils Hashicorp (Nomad et Consul)
|
||||
- Sécurisation supplémentaire à base d'intent et d'ACL
|
||||
- Gestion intégrée du nommage, du routage et de la sécurité
|
||||
|
||||
**Inconvénients:**
|
||||
|
||||
- Nécessite sans doute pas mal de travail pour le mettre en place
|
||||
- Ajoute un outil potentiellement complexe et peu maîtrisé
|
||||
- Les applications ne se parlent plus directement sur le réseau -> problèmes dans certains cas (par exemple Garage peut-il toujours fonctionner ?)
|
||||
- Consommateur de CPU à haut débit
|
||||
- Protocole encore moins standard que le VPN (en estimant que si Wireguard a atterri dans le noyau, c'est que c'est relativement standard quand même)
|
||||
|
||||
**Conclusion:** L'arbitrage entre la solution VPN et la solution service mesh se fait sur les deux points suivants: outil permettant de sécuriser les connexions en les autorisant au cas-par-cas (ACL+intent) vs. outil permettant de préserver un fonctionnement comme en LAN et où les applications peuvent utiliser les propriétés d'un tel réseau "classique".
|
50
src/Technique/Jalon/index.md
Normal file
|
@ -0,0 +1,50 @@
|
|||
# Jalons
|
||||
|
||||
Les jalons définissent les grands objectifs techniques que nous souhaitons atteindre.
|
||||
Ils nous servent à garder le cap quand on a la tête dans le technique tout en clarifiant nos pensées.
|
||||
Nous valorisons la critique et les décisions participatives, tout le monde est donc encouragé à venir donner son avis et enrichir cette page en l'éditant directement ou en proposant une merge request.
|
||||
|
||||
## Vers l'auto-hébergement résilient
|
||||
|
||||
**Auto hébergement** : nos valeurs -> soit en justice, soit en vulgarisant, soit en proposant une alternative -> proposer une alternative nécessite de reprendre le contrôle.
|
||||
|
||||
**Résilient** : la course à l'uptime est veine. dans l'absolu on pourrait accepter un service qui serait down une heure par jour. le vrai enjeu, c'est la pression portée sur les administrateurs. ne pas se retrouver l'esclave de la machine. c'est LA raison pour laquelle tout le monde arrête l'auto hébergement un jour ou un autre dans sa vie.
|
||||
|
||||
### Pt. 1 : La vieille tour (de Babel)
|
||||
|
||||
10 ans d'essai, 3 *setups* différents, plus de puissance qu'ajd -> pas un pb de puissance.
|
||||
Connexion ADSL, CPL.
|
||||
|
||||
Expérience :
|
||||
* Crash d'une carte mère x2
|
||||
* Crash d'un disque dur
|
||||
* OS cassé
|
||||
* CPL planté
|
||||
* Barrette de RAM cassée
|
||||
* Plus d'électricité
|
||||
* Problèmes de peering
|
||||
|
||||
Tout est un SPOF. Aller-retour Rennes-Nevers.
|
||||
Diagnostique à la hâte, commande de RAM alors que MOBO broken.
|
||||
|
||||
### Pt. 2 : La grappe (mousse et pampre)
|
||||
|
||||
*Je faisais un brin de causette, le genre réservé, tu me connais. Mousse et pampre. Voilà tout d'un coup qu'un petit cave est venu me chercher, les gros mots et tout !*
|
||||
|
||||
La grappe de serveur, ou *cluster* dans la langue de Shakespeare.
|
||||
Enlever certains points de failure.
|
||||
|
||||
Expérience :
|
||||
* Coupure électrique ~2h x3
|
||||
|
||||
SPOF :
|
||||
* Connexion
|
||||
* Routeur
|
||||
* Switch
|
||||
* Électricité
|
||||
|
||||
### Pt. 3 : La foule (feat Edith Piaf)
|
||||
|
||||
*Emportés par la foule qui nous traîne, qui nous entraîne...*
|
||||
|
||||
objectif : plus de SPOF
|
118
src/Technique/Operations/Assets/exemple_offre.txt
Normal file
|
@ -0,0 +1,118 @@
|
|||
type: offer, sdp: v=0
|
||||
o=- 1923518516 2 IN IP4 127.0.0.1
|
||||
s=-
|
||||
t=0 0
|
||||
a=msid-semantic: WMS 48d3ae09-99f6-4a73-bad1-1b0963eaf3cc-1
|
||||
a=group:BUNDLE audio video data
|
||||
m=audio 10000 RTP/SAVPF 111 103 104 126
|
||||
c=IN IP4 82.253.205.190
|
||||
a=rtpmap:111 opus/48000/2
|
||||
a=rtpmap:103 ISAC/16000
|
||||
a=rtpmap:104 ISAC/32000
|
||||
a=rtpmap:126 telephone-event/8000
|
||||
a=fmtp:111 minptime=10;useinbandfec=1
|
||||
a=rtcp:9 IN IP4 0.0.0.0
|
||||
a=rtcp-fb:111 transport-cc
|
||||
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
|
||||
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
|
||||
a=setup:actpass
|
||||
a=mid:audio
|
||||
a=sendrecv
|
||||
a=ice-ufrag:97nc61e52b11gu
|
||||
a=ice-pwd:k2df7f8vgknj27sctj550cl2u
|
||||
a=fingerprint:sha-1 FC:4F:0B:F5:34:07:D8:09:47:D2:3C:FE:D1:8E:05:4B:05:10:CD:A1
|
||||
a=candidate:1 1 ssltcp 2130706431 172.17.0.1 8080 typ host generation 0
|
||||
a=candidate:2 1 ssltcp 2130706431 192.168.1.4 8080 typ host generation 0
|
||||
a=candidate:4 1 udp 2113932031 172.17.0.1 10000 typ host generation 0
|
||||
a=candidate:5 1 udp 2113932031 192.168.1.4 10000 typ host generation 0
|
||||
a=candidate:3 1 ssltcp 1677724415 82.253.205.190 8080 typ srflx raddr 192.168.1.4 rport 8080 generation 0
|
||||
a=candidate:6 1 udp 1677724415 82.253.205.190 10000 typ srflx raddr 192.168.1.4 rport 10000 generation 0
|
||||
a=ssrc:3265394670 cname:mixed
|
||||
a=ssrc:3265394670 msid:mixedmslabel mixedlabelaudio0
|
||||
a=ssrc:3265394670 mslabel:mixedmslabel
|
||||
a=ssrc:3265394670 label:mixedlabelaudio0
|
||||
a=ssrc:3761143749 cname:sMYSy0kNyRU3eK0c-1
|
||||
a=ssrc:3761143749 msid:48d3ae09-99f6-4a73-bad1-1b0963eaf3cc-1 8a034425-b6b5-4928-ab5f-9ca0ec4168c4-1
|
||||
a=ssrc:3761143749 mslabel:48d3ae09-99f6-4a73-bad1-1b0963eaf3cc-1
|
||||
a=ssrc:3761143749 label:8a034425-b6b5-4928-ab5f-9ca0ec4168c4-1
|
||||
a=ssrc:3240916804 cname:75Ayhq4Cuv7k5JAP-1
|
||||
a=ssrc:3240916804 msid:27755a82-e9e7-4cc4-bdb3-354a06b3f32a-1 45de0b7f-8590-4232-9bde-77d55a7366b5-1
|
||||
a=rtcp-mux
|
||||
m=video 10000 RTP/SAVPF 100 107 101 96 97 99
|
||||
c=IN IP4 82.253.205.190
|
||||
a=rtpmap:100 VP8/90000
|
||||
a=rtpmap:107 H264/90000
|
||||
a=rtpmap:101 VP9/90000
|
||||
a=rtpmap:96 rtx/90000
|
||||
a=rtpmap:97 rtx/90000
|
||||
a=rtpmap:99 rtx/90000
|
||||
a=fmtp:100 x-google-start-bitrate=800
|
||||
a=fmtp:107 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f;x-google-start-bitrate=800
|
||||
a=fmtp:101 x-google-start-bitrate=800
|
||||
a=fmtp:96 apt=100
|
||||
a=fmtp:97 apt=101
|
||||
a=fmtp:99 apt=107
|
||||
a=rtcp:9 IN IP4 0.0.0.0
|
||||
a=rtcp-fb:100 ccm fir
|
||||
a=rtcp-fb:100 nack
|
||||
a=rtcp-fb:100 nack pli
|
||||
a=rtcp-fb:100 transport-cc
|
||||
a=rtcp-fb:107 ccm fir
|
||||
a=rtcp-fb:107 nack
|
||||
a=rtcp-fb:107 nack pli
|
||||
a=rtcp-fb:107 transport-cc
|
||||
a=rtcp-fb:101 ccm fir
|
||||
a=rtcp-fb:101 nack
|
||||
a=rtcp-fb:101 nack pli
|
||||
a=rtcp-fb:101 transport-cc
|
||||
a=rtcp-fb:96 ccm fir
|
||||
a=rtcp-fb:96 nack
|
||||
a=rtcp-fb:96 nack pli
|
||||
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
|
||||
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
|
||||
a=setup:actpass
|
||||
a=mid:video
|
||||
a=sendrecv
|
||||
a=ice-ufrag:97nc61e52b11gu
|
||||
a=ice-pwd:k2df7f8vgknj27sctj550cl2u
|
||||
a=fingerprint:sha-1 FC:4F:0B:F5:34:07:D8:09:47:D2:3C:FE:D1:8E:05:4B:05:10:CD:A1
|
||||
a=candidate:1 1 ssltcp 2130706431 172.17.0.1 8080 typ host generation 0
|
||||
a=candidate:2 1 ssltcp 2130706431 192.168.1.4 8080 typ host generation 0
|
||||
a=candidate:4 1 udp 2113932031 172.17.0.1 10000 typ host generation 0
|
||||
a=candidate:5 1 udp 2113932031 192.168.1.4 10000 typ host generation 0
|
||||
a=candidate:3 1 ssltcp 1677724415 82.253.205.190 8080 typ srflx raddr 192.168.1.4 rport 8080 generation 0
|
||||
a=candidate:6 1 udp 1677724415 82.253.205.190 10000 typ srflx raddr 192.168.1.4 rport 10000 generation 0
|
||||
a=ssrc:3339205972 cname:75Ayhq4Cuv7k5JAP-1
|
||||
a=ssrc:3339205972 msid:27755a82-e9e7-4cc4-bdb3-354a06b3f32a-1 4de277cb-7421-402a-bbb1-2090dab4540e-1
|
||||
a=ssrc:3560865865 cname:sMYSy0kNyRU3eK0c-1
|
||||
a=ssrc:3560865865 msid:48d3ae09-99f6-4a73-bad1-1b0963eaf3cc-1 21a02fe8-c9f4-49fe-aaef-4c4ad48a3516-1
|
||||
a=ssrc:3560865865 mslabel:48d3ae09-99f6-4a73-bad1-1b0963eaf3cc-1
|
||||
a=ssrc:3560865865 label:21a02fe8-c9f4-49fe-aaef-4c4ad48a3516-1
|
||||
a=ssrc:1942865873 cname:mixed
|
||||
a=ssrc:1942865873 msid:mixedmslabel mixedlabelvideo0
|
||||
a=ssrc:1942865873 mslabel:mixedmslabel
|
||||
a=ssrc:1942865873 label:mixedlabelvideo0
|
||||
a=ssrc:3656552182 cname:sMYSy0kNyRU3eK0c-1
|
||||
a=ssrc:3656552182 msid:48d3ae09-99f6-4a73-bad1-1b0963eaf3cc-1 21a02fe8-c9f4-49fe-aaef-4c4ad48a3516-1
|
||||
a=ssrc:3656552182 mslabel:48d3ae09-99f6-4a73-bad1-1b0963eaf3cc-1
|
||||
a=ssrc:3656552182 label:21a02fe8-c9f4-49fe-aaef-4c4ad48a3516-1
|
||||
a=ssrc:4136660991 cname:75Ayhq4Cuv7k5JAP-1
|
||||
a=ssrc:4136660991 msid:27755a82-e9e7-4cc4-bdb3-354a06b3f32a-1 4de277cb-7421-402a-bbb1-2090dab4540e-1
|
||||
a=ssrc-group:FID 3560865865 3656552182
|
||||
a=ssrc-group:FID 3339205972 4136660991
|
||||
a=rtcp-mux
|
||||
a=x-google-flag:conference
|
||||
m=application 10000 DTLS/SCTP 5000
|
||||
c=IN IP4 82.253.205.190
|
||||
a=setup:actpass
|
||||
a=mid:data
|
||||
a=ice-ufrag:97nc61e52b11gu
|
||||
a=ice-pwd:k2df7f8vgknj27sctj550cl2u
|
||||
a=fingerprint:sha-1 FC:4F:0B:F5:34:07:D8:09:47:D2:3C:FE:D1:8E:05:4B:05:10:CD:A1
|
||||
a=candidate:1 1 ssltcp 2130706431 172.17.0.1 8080 typ host generation 0
|
||||
a=candidate:2 1 ssltcp 2130706431 192.168.1.4 8080 typ host generation 0
|
||||
a=candidate:4 1 udp 2113932031 172.17.0.1 10000 typ host generation 0
|
||||
a=candidate:5 1 udp 2113932031 192.168.1.4 10000 typ host generation 0
|
||||
a=candidate:3 1 ssltcp 1677724415 82.253.205.190 8080 typ srflx raddr 192.168.1.4 rport 8080 generation 0
|
||||
a=candidate:6 1 udp 1677724415 82.253.205.190 10000 typ srflx raddr 192.168.1.4 rport 10000 generation 0
|
||||
a=sctpmap:5000 webrtc-datachannel 1024
|
BIN
src/Technique/Operations/Assets/livebox_parefeu_personnalise.png
Normal file
After Width: | Height: | Size: 82 KiB |
94
src/Technique/Operations/Jitsi.md
Normal file
|
@ -0,0 +1,94 @@
|
|||
## 2020-04-02 Campagne de debug Jitsi
|
||||
|
||||
Contact: Quentin
|
||||
|
||||
### Description du problème
|
||||
|
||||
Les conversations à 3+ donc relayées par le serveur ne fonctionnent pas bien.
|
||||
Louison m'a rapporté que ça avait marché pour lui (3 utilisateurs avec un Webkit).
|
||||
Mais moi ça a échoué hier soir (01/04/2020) avec des participants sous Firefox.
|
||||
Le bug est toujours le même : on entend 2 personnes sur 3 ou on voit 2 personnes sur 3, on recharge la page et c'est quelqu'un d'autre pour qui ça ne fonctionne plus. Souvent c'est que dans un sens.
|
||||
À chaque fois en passant sur Facebook Messenger, le problème est résolu instantanément.
|
||||
Par contre Facebook Messenger impose Google Chrome/Chromium pour les visio de groupe (et ne supporte donc pas Firefox).
|
||||
|
||||
D'où mes 2 suspicions :
|
||||
|
||||
- Firefox a un bug quelconque dans sa pile WebRTC déclenché par le mode conversation de groupe
|
||||
- Jitsi a un problème avec les déconnexions/changement de connexion/petit hoquets du réseau et n'arrive pas à se reconnecter. Ça pourrait être rendu pire à certain moment de la journée comme le soir où le réseau est plus sollicité. Et ce serait provoqué lors du reload on repasse de 3 à 2, en P2P donc puis de nouveau de 2 à 3.
|
||||
|
||||
### Approfondissement
|
||||
|
||||
Avant d'aller plus loin, nous avons voulu prendre le temps d'identifier précisément les problèmes d'expérience utilisateurs et leur corrélation avec la plateforme de l'utilisateur (navigateur, OS).
|
||||
|
||||
Pour celà, nous avons suivi deux approches :
|
||||
1. Mener nos propres tests
|
||||
2. Chercher d'autres retours
|
||||
|
||||
#### Mener nos propres tests
|
||||
|
||||
Nous avons effectué deux appels : un avec Firefox seulement et un avec Chrome/Chromium seulement.
|
||||
Merci à Alex, Adrien et Maximilien pour leur participation.
|
||||
|
||||
Voilà les conclusions que nous avons tirées de nos tests :
|
||||
|
||||
- L'appel avec Firefox a déclenché le bug immédiatement, peu importe la version de Firefox ou de l'OS (firefox stable/nightly, fedora stable/beta, etc.)
|
||||
- Le passage de tout le monde sous Chrome/Chromium a permis d'avoir une conversation stable.
|
||||
- Adrien avait sa Livebox avec pare-feu configuré en mode "élevé" et a dû ajouter dans sa liste blanche les ports utilisés par Jitsi (`4443/tcp` et `10000/udp` au moment du test, seul un des deux a besoin d'être accessible)
|
||||
|
||||
Nous avons donc demandé à Adrien quels étaient les ports ouverts par défaut dans le mode élevé de sa box :
|
||||
|
||||
![Livebox Parefeu Personnalisé](Assets/livebox_parefeu_personnalise.png)
|
||||
|
||||
Nous avons dans un premier temps retenu le port `995/tcp` pour Jitsi, le port UDP ne pouvant être changé (limitation de Jitsi).
|
||||
Cependant, pour des raisons de sécurité, les navigateurs ne peuvent pas utiliser les ports en dessous de `1024/*`, à l'exception des ports `80/tcp` et `443/tcp` comme l'indique ;'issue [#3583](https://bugs.chromium.org/p/webrtc/issues/detail?id=3583) de Chromium.
|
||||
|
||||
La capture n'indique pas de port TCP supérieur à 1024, nous ne pouvons donc pas résoudre ce problème de notre côté, car à l'heure actuelle, nos ports `80/tcp` et `443/tcp` sont utilisés et nous n'avons qu'une seule IP publique.
|
||||
Les utilisateurs activant le parefeu en mode élevé devront ajouter une exception dans leur parefeu eux-mêmes.
|
||||
|
||||
#### Chercher d'autres retours
|
||||
|
||||
[Tedomum](https://tedomum.net/) a eu connaissance de problèmes similaires.
|
||||
Ils ont également identifié Firefox et assurent qu'avec l'application Android ça marche bien.
|
||||
Ils me confirment que le problème vient bien du logiciel et non pas de notre déploiement.
|
||||
Ils m'ont pointé entre autres vers cette issue github [#4758](https://github.com/jitsi/jitsi-meet/issues/4758)
|
||||
Apparemment une issue est dédiée en particulier au problème que nous rencontrons de déconnexion partielle d'un participant, mais nous ne l'avons pas encore retrouvée.
|
||||
|
||||
### Correctifs
|
||||
|
||||
1. Notre instance Jitsi a été reconfigurée pour refuser Firefox. Suivre l'avancée du développement de Jitsi pour Firefox
|
||||
* [#4758](https://github.com/jitsi/jitsi-meet/issues/4758)
|
||||
* [#5439](https://github.com/jitsi/jitsi-meet/issues/5439)
|
||||
* _À compléter_
|
||||
2. Pour relayer la vidéo à travers la plupart des parefeux, notre `videobridge` Jitsi devait écouter sur le port `443/tcp`. Or ce port est déjà utilisé par notre frontal HTTPS. À défaut, Jitsi est maintenant configuré avec `8080/tcp` et `10000/udp` (contre `4443/tcp` et `10000/udp` avant).
|
||||
* Un déploiement en IPv6 pourrait résoudre le problème pour une partie des utilisateurs
|
||||
* Avoir un cluster géo-distribué avec plusieurs IPv4 pourrait également résoudre le problème
|
||||
* Avoir un frontend layer 4 (niveau TCP) qui trouve une signature pour router du DTLS vers videobridge et du TLS vers traefik
|
||||
|
||||
### À propos du control/data plane de Jitsi
|
||||
|
||||
Notre videobridge écoute donc sur les ports `8080/tcp` et `10000/udp`.
|
||||
|
||||
WebRTC fonctionne en deux étapes :
|
||||
- Des offres doivent être échangées via un serveur de signaling quelconque
|
||||
- Ensuite, ces offres servent à connecter des clients directement via un protocole TCP ou UDP avec un thin layer propre à WebRTC
|
||||
|
||||
#### Le control plane de Jitsi : Prosody sur HTTPS via Bosh/XMPP
|
||||
|
||||
Le serveur de signaling Jitsi n'est autre que le serveur de chat prosody.
|
||||
Pour ça, prosody est exposé à travers HTTP grâce au protocole BOSH (XMPP overs HTTPS).
|
||||
Une fois l'offre reçue ([exemple](Assets/exemple_offre.txt)), elle est enregistrée dans le navigateur à l'aide de `setRemoteDescription` pour initialiser le data plane.
|
||||
On peut débugger le signaling WebRTC sous Chromium avec [chrome://webrtc-internarls](chrome://webrtc-internals/).
|
||||
|
||||
Quand plus de deux participants sont connectés dans la conversation, Jitsi n'envoie pas les offres de chaque participant aux autres participants. À la place, elle envoie qu'une seule offre, celle de son VideoBridge.
|
||||
|
||||
Ainsi, le VideoBridge est une sorte de client WebRTC particulier, qui récolte et redispatche à travers WebRTC tous les flux video/audio.
|
||||
|
||||
#### Le data plane de Jitsi : videobridge sur DTLS/SCTP via WebRTC
|
||||
|
||||
WebRTC utilise deux formats de paquets selon [Mozilla Developer Network|RTCDataChannel|DataFormat](https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel#Data_format) :
|
||||
- `UDP/DTLS/SCTP`
|
||||
- `TCP/DTLS/SCTP`
|
||||
|
||||
On a donc un format de données arbitraire encapsulé dans du SCTP lui-même encapsulé dans du DTLS.
|
||||
DTLS est prévu pour les datagrammes à l'origine, car WebRTC est prévu d'abord pour fonctionner sous UDP.
|
||||
Le TCP est là en mode dégradé, en secours, il sert juste de tunnel pour relayer des datagrammes.
|
11
src/Technique/Operations/index.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
## Créer un utilisateur Postgres
|
||||
|
||||
1. Créer un compte de service dans Guichet
|
||||
2. `exec` dans un conteneur `stolon-keeper` sur une machine
|
||||
3. Executer `psql -h psql-proxy.service.2.cluster.deuxfleurs.fr`
|
||||
4. Rentrer le mot de passe
|
||||
5. Créer l'utilisateur `CREATE USER <username>;`
|
||||
6. (Optionnel) Lui créer une base de données : `CREATE DATABASE <dbname> OWNER <username>`
|
||||
7. (Optionnel) Lui donner les privileges appropriés, eg. `GRANT READ PRIVILEGES ON DATABASE <anotherdbname> TO <username>;`
|
||||
8. Vérifier les permissions : `psql -h psql-proxy.service.2.cluster.deuxfleurs.fr -U <username> <dbname>`
|
||||
|
24
src/Technique/index.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
Deuxfleurs utilise les composants suivants dans son infrastructure:
|
||||
|
||||
- Ansible (configuration des noeuds)
|
||||
- Docker (conteneurs)
|
||||
- Nomad (orchestration des conteneurs)
|
||||
- Consul (stockage clef/valeur distribué, découverte de services)
|
||||
- Glusterfs (système de fichiers distribué)
|
||||
- Stolon (système de réplication pour PostgreSQL)
|
||||
|
||||
Les services proposés sont les suivants:
|
||||
|
||||
- Chat via Matrix (Synapse, Riot)
|
||||
- Email (Postfix, Dovecot, SoGo)
|
||||
- Stockage (Seafile)
|
||||
|
||||
Par ailleurs, nous avons développé nous-même un certain nombre d'outils pour compléter la stack:
|
||||
|
||||
- [Bottin](https://bottin.eu), un serveur LDAP (gestion des comptes utilisateurs) basé sur le stockage clef/valeur de Consul
|
||||
- [Guichet](https://git.deuxfleurs.fr/Deuxfleurs/Guichet/), une interface web de gestion des utilisateurs
|
||||
- [Easybridge](https://git.deuxfleurs.fr/lx/Easybridge/), un bridge entre Matrix et d'autres réseaux
|
||||
- [Diplonat](https://git.deuxfleurs.fr/Deuxfleurs/diplonat/), un outil permettant de configurer automatiquement les redirections de ports d'un routeur
|
||||
- [Garage](https://git.deuxfleurs.fr/lx/garage/), un stockage d'objets distribué multi-sites implémentant un sous-ensemble de l'API Amazon S3
|
||||
|
||||
Le code de l'infrastructure [est publiquement disponible](https://git.deuxfleurs.fr/Deuxfleurs/deuxfleurs.fr/).
|
39
src/_layout.pug
Normal file
|
@ -0,0 +1,39 @@
|
|||
include _mixin/menu.pug
|
||||
|
||||
block root
|
||||
doctype html
|
||||
head
|
||||
meta(charset='utf-8')
|
||||
title 💮💮 deuxfleurs - #{title}
|
||||
link(rel="stylesheet", href="/css/main.css")
|
||||
meta(name="viewport", content="width=device-width, initial-scale=1.0")
|
||||
body
|
||||
aside
|
||||
header
|
||||
a#menu(href="#").mobile_inline
|
||||
svg(viewBox="0 0 100 80", width="40", height="40")
|
||||
rect(width="100", height="20")
|
||||
rect(y="30" width="100" height="20")
|
||||
rect(y="60" width="100" height="20")
|
||||
|
||||
h1
|
||||
a(href="/") deuxfleurs
|
||||
nav.computer_block
|
||||
section.center
|
||||
img(src="/img/flower.svg", width="40")
|
||||
|
|
||||
img(src="/img/flower.svg", width="40")
|
||||
+menu(root, element)
|
||||
|
||||
main
|
||||
block content
|
||||
|
||||
script.
|
||||
(_ => {
|
||||
const hamburger = document.getElementById('menu')
|
||||
hamburger.onclick = _ => {
|
||||
const nav = document.querySelector('body > aside > header > nav')
|
||||
console.log(nav.style.display)
|
||||
nav.style.display = nav.style.display != 'block' ? 'block' : 'none'
|
||||
}
|
||||
})()
|
10
src/_markdown.pug
Normal file
|
@ -0,0 +1,10 @@
|
|||
extends ./_layout.pug
|
||||
|
||||
prepend root
|
||||
- if (element.tags.includes('is_index'))
|
||||
- title = element.nice_path[element.nice_path.length - 1]
|
||||
- else
|
||||
- title = element.nice_name
|
||||
|
||||
block content
|
||||
!= markdown
|
13
src/_mixin/menu.pug
Normal file
|
@ -0,0 +1,13 @@
|
|||
mixin menu(o, element)
|
||||
ul
|
||||
each val in o.children
|
||||
- if (val.type == 'folder' && val.tags.includes('document'))
|
||||
li
|
||||
- if (val.tags.includes('has_index'))
|
||||
a(href=val.url, class=val.index.url == element.url ? 'selected' : null)= val.nice_name
|
||||
- else
|
||||
span= val.nice_name
|
||||
+menu(val, element)
|
||||
- else if (val.type == 'file' && val.tags.includes('document') && !val.tags.includes('is_index'))
|
||||
li
|
||||
a(href=val.url, class=val.url == element.url ? 'selected' : null)= val.nice_name
|
181
src/css/main.css
Normal file
|
@ -0,0 +1,181 @@
|
|||
/*
|
||||
* FONTS
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-family: "Heroes";
|
||||
src: url('../fonts/texgyreheros-regular.otf') format('truetype');
|
||||
}
|
||||
|
||||
/*
|
||||
* RESET CSS
|
||||
*/
|
||||
|
||||
* {
|
||||
font-family: Heroes;
|
||||
font-size: 1em; /* We use browser's default */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html { height: 100% }
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
max-width: 1200px;
|
||||
flex-direction: row;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
* RESPONSIVE
|
||||
*/
|
||||
.mobile_block, .mobile_inline { display: none }
|
||||
|
||||
@media screen and (max-width: 800px) {
|
||||
body { flex-direction: column }
|
||||
.computer_block { display: none }
|
||||
.mobile_block { display: block }
|
||||
.mobile_inline { display: inline }
|
||||
}
|
||||
|
||||
/*
|
||||
* CORE TEMPLATE
|
||||
*/
|
||||
|
||||
/* Header + Menu */
|
||||
body > aside > header {
|
||||
color: white;
|
||||
background: rgb(12,144,110);
|
||||
background: linear-gradient(0deg, rgb(21, 65, 73) 0%, rgb(55, 141, 100) 50%, rgb(12, 144, 110) 100%);
|
||||
padding: 1.5rem;
|
||||
margin: 0.8rem;
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0px 0px 30px rgba(31,38,103,0.2);
|
||||
}
|
||||
|
||||
body > aside > header > a > svg {
|
||||
fill: white;
|
||||
display: inline;
|
||||
vertical-align: sub;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
body > aside > header > h1 { display: inline }
|
||||
body > aside > header a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
body > aside > header > nav ul {
|
||||
list-style-type: none;
|
||||
padding-left: 1em;
|
||||
}
|
||||
body > aside > header > nav > ul { padding-left: 0px }
|
||||
body > aside > header > nav a:hover { text-decoration: underline }
|
||||
body > aside > header > nav .selected { font-weight: bold }
|
||||
body > aside > header > nav .selected::before { content: "» " }
|
||||
|
||||
body > main {
|
||||
padding: 1.5rem;
|
||||
max-width: 1200px;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* TEXT CORE (think markdown)
|
||||
*/
|
||||
|
||||
h1 { font-size: 2.5rem }
|
||||
h2 { font-size: 2.0rem }
|
||||
h3 { font-size: 1.75rem }
|
||||
h4 { font-size: 1.50rem }
|
||||
h5 { font-size: 1.25rem }
|
||||
h6 { font-size: 1.10rem }
|
||||
h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem }
|
||||
section, p, ul, ol, table { margin-bottom: 1rem }
|
||||
ul, ol { padding-left: 1.5em }
|
||||
a { color: rgb(12,144,110)}
|
||||
table { border-collapse: collapse }
|
||||
th { background-color: #fafafa }
|
||||
td, th {
|
||||
border: 1px solid #ddd;
|
||||
padding: 0.3rem 0.5rem;
|
||||
}
|
||||
img {
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0px 0px 30px rgba(31,38,103,0.2);
|
||||
margin: 0.5rem;
|
||||
}
|
||||
img.simple {
|
||||
border-radius: 0px;
|
||||
box-shadow: none;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* UTILS
|
||||
*/
|
||||
|
||||
/* float */
|
||||
.left { float: left }
|
||||
.right { float: right }
|
||||
section::after, p::after {
|
||||
clear: both;
|
||||
display: block;
|
||||
content: "";
|
||||
}
|
||||
|
||||
/* center */
|
||||
.center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/*
|
||||
* ELEMENTS
|
||||
*/
|
||||
|
||||
input {
|
||||
border: 0.1em black solid;
|
||||
width: 50%;
|
||||
min-width: 300px;
|
||||
font-size: 1.6em;
|
||||
border: 0.1em black solid;
|
||||
padding: 0.3em;
|
||||
}
|
||||
|
||||
.button {
|
||||
padding: 0.3em;
|
||||
background-color: #519c60;
|
||||
font-size: 1.6em;
|
||||
border: 0.1em solid #519c60;
|
||||
color: white;
|
||||
margin: 0em 0em 0em 1em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* service button */
|
||||
|
||||
.service-box {
|
||||
color: #000;
|
||||
text-decoration: none;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 0.5rem;
|
||||
width: 250px;
|
||||
text-align:center;
|
||||
margin: 1em 1em 0em 0em;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.service-box:hover {
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.frame {
|
||||
border-left: 1rem solid #ddd;
|
||||
padding-left: 1rem;
|
||||
}
|
BIN
src/fonts/texgyreheros-bold.otf
Normal file
BIN
src/fonts/texgyreheros-bolditalic.otf
Normal file
BIN
src/fonts/texgyreheros-italic.otf
Normal file
BIN
src/fonts/texgyreheros-regular.otf
Normal file
BIN
src/fonts/texgyreheroscn-bold.otf
Normal file
BIN
src/fonts/texgyreheroscn-bolditalic.otf
Normal file
BIN
src/fonts/texgyreheroscn-italic.otf
Normal file
BIN
src/fonts/texgyreheroscn-regular.otf
Normal file
BIN
src/img/arobase.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/img/flower.png
Normal file
After Width: | Height: | Size: 11 KiB |
1
src/img/flower.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill-opacity="0.0" fill="#FFF" d="M15.632 34.661c-.799-.597-1.498-1.484-2.035-2.592l-.228-.47-.46.249c-.975.528-1.913.858-2.744.969l-.202-3.756-3.636.968c-.157-.854-.125-1.887.096-3.022l.103-.525-.532-.066c-1.242-.154-2.306-.525-3.104-1.08l1.521-2.917-2.988-1.523c.319-.944.948-1.882 1.834-2.735l.377-.363-.379-.36c-.803-.764-1.408-1.554-1.77-2.311l3.51-1.353-2.045-3.159c.74-.402 1.693-.686 2.789-.832l.519-.068-.091-.514c-.215-1.211-.172-2.338.124-3.288l3.308.523.524-3.308c.988.013 2.08.326 3.164.907l.462.248.226-.473c.479-1.003 1.044-1.824 1.653-2.404L18 4.326l2.372-2.92c.609.58 1.175 1.401 1.653 2.404l.226.473.462-.247c1.085-.581 2.178-.894 3.164-.906l.523 3.308 3.31-.525c.296.951.34 2.078.124 3.288l-.092.515.518.069c1.095.145 2.048.43 2.788.832l-2.046 3.156 3.511 1.355c-.361.757-.966 1.547-1.77 2.311l-.379.36.377.363c.888.854 1.516 1.793 1.835 2.736l-2.984 1.52 1.521 2.984c-.812.574-1.871.964-3.094 1.134l-.518.072.096.514c.201 1.089.226 2.083.073 2.909l-3.634-.97-.204 3.757c-.83-.11-1.768-.44-2.742-.968l-.459-.249-.228.47c-.539 1.107-1.237 1.994-2.036 2.591L18 32.293l-2.368 2.368z"/><path d="M7.092 10.678c-.53-1.489-.698-2.97-.432-4.2l2.368.375.987.156.157-.988.375-2.368c1.261.127 2.613.743 3.862 1.706.118-.337.244-.663.382-.967-1.551-1.135-3.223-1.763-4.73-1.763-.123 0-.245.004-.366.013l-.511 3.223-3.224-.511c-.6 1.487-.565 3.415.085 5.393.335-.037.684-.061 1.047-.069zm14.501-5.319c1.248-.962 2.6-1.578 3.86-1.705l.376 2.368.156.988.987-.157 2.369-.376c.266 1.23.098 2.71-.432 4.2.361.009.711.032 1.046.07.651-1.978.685-3.906.085-5.394l-3.225.512-.511-3.224c-.12-.008-.242-.012-.365-.012-1.507 0-3.179.628-4.73 1.762.14.306.266.631.384.968zM7.368 27h.035c.067 0 .157-.604.26-.947-.098.004-.197.046-.294.046-1.496 0-2.826-.303-3.83-.89l1.089-2.128.454-.887-.891-.452-2.136-1.088c.508-1.151 1.515-2.25 2.818-3.143-.287-.219-.561-.441-.81-.669-1.687 1.217-2.846 2.755-3.235 4.31l2.908 1.483-1.482 2.843C3.475 26.501 5.303 27 7.368 27zm27.806-5.846c-.39-1.555-1.548-3.093-3.234-4.311-.25.228-.523.451-.81.669 1.304.893 2.31 1.992 2.817 3.145l-2.136 1.088-.891.453.454.892 1.089 2.137c-1.004.587-2.332.904-3.828.904-.099 0-.199-.01-.299-.013.103.344.192.683.26 1.011l.039.002c2.066 0 3.892-.563 5.112-1.587l-1.482-2.908 2.909-1.482zm-12.653 9.182c-.447 1.517-1.181 2.812-2.119 3.651l-1.695-1.694-.707-.707-.707.707-1.695 1.694c-.938-.839-1.673-2.136-2.12-3.652-.296.206-.593.397-.886.563.636 1.98 1.741 3.559 3.1 4.409L18 33l2.308 2.308c1.358-.851 2.464-2.428 3.101-4.408-.295-.168-.591-.359-.888-.564z" fill="#FFF"/><path fill="#FFF" d="M20.118 5.683c.426 1.146.748 2.596.841 4.284l.2 3.683 3.564-.946c1.32-.351 2.655-.536 3.86-.536.16 0 .318.003.474.01l-1.827 2.819 3.139 1.211c-.958.759-2.237 1.514-3.814 2.123l-3.441 1.328 2.001 3.099c.918 1.42 1.509 2.782 1.838 3.96l-3.244-.865-.182 3.357c-1.019-.677-2.132-1.66-3.198-2.973L18 23.374l-2.328 2.862c-1.066 1.312-2.179 2.295-3.198 2.972l-.18-3.354-3.248.864c.329-1.178.921-2.54 1.839-3.961l2.004-3.099-3.442-1.328c-1.577-.609-2.856-1.363-3.814-2.122L8.768 15l-1.827-2.823c.155-.006.313-.01.473-.01 1.206 0 2.541.185 3.861.536l3.564.947.202-3.683c.092-1.688.415-3.138.84-4.284L18 8.292l2.118-2.609m.19-4.991L18 3.533 15.692.692c-1.989 1.532-3.421 4.992-3.646 9.112-1.617-.43-3.192-.637-4.632-.637-2.11 0-3.929.445-5.161 1.289l1.989 3.073-3.415 1.316c.842 2.366 3.69 4.797 7.54 6.283-2.241 3.465-3.116 7.106-2.407 9.516l3.537-.941.196 3.654c2.512-.07 5.703-2.027 8.307-5.228 2.603 3.201 5.796 5.158 8.306 5.228l.198-3.655 3.535.943c.71-2.411-.165-6.05-2.404-9.517 3.849-1.485 6.696-3.918 7.538-6.283l-3.415-1.318 1.99-3.07c-1.233-.844-3.053-1.29-5.164-1.29-1.438 0-3.013.207-4.63.636-.225-4.119-1.657-7.579-3.646-9.111z"/></svg>
|
After Width: | Height: | Size: 3.7 KiB |
1
src/img/infra.drawio
Normal file
68
src/index.pug
Normal file
|
@ -0,0 +1,68 @@
|
|||
extends _layout.pug
|
||||
|
||||
prepend root
|
||||
- title = "deuxfleurs"
|
||||
|
||||
block content
|
||||
section
|
||||
img(style="width: 100%; margin:-0.5rem;", src="/img/flower.png")
|
||||
|
||||
section
|
||||
h2 # nos services
|
||||
section
|
||||
a.service-box.left(href='/Guide/Discussion.html')
|
||||
div(style='font-size: 80px; height: 120px') 💬
|
||||
h5 discussion
|
||||
a.service-box.left(href='/Guide/Visioconférence.html')
|
||||
div(style='font-size: 80px; height: 120px') 📞
|
||||
h5 visioconférence
|
||||
a.service-box.left(href='/Guide/Sites web.html')
|
||||
div(style='font-size: 80px; height: 120px') 🌐
|
||||
h5 sites web
|
||||
a.service-box.left(href='https://cloud.deuxfleurs.fr')
|
||||
div(style='font-size: 80px; height: 120px') 🔒
|
||||
h5 sauvegarde de documents
|
||||
a.service-box.left(href='https://sogo.deuxfleurs.fr')
|
||||
div(style='font-size: 80px; height: 120px') 📨
|
||||
h5 emails
|
||||
a.service-box.left(href='https://p.adnab.me')
|
||||
div(style='font-size: 80px; height: 120px') 📄
|
||||
h5 collaboration
|
||||
a.service-box.left(href='https://git.deuxfleurs.fr')
|
||||
div(style='font-size: 80px; height: 120px') 💻
|
||||
h5 code
|
||||
|
||||
p ⚠️ Vous devez être membre pour utiliser ces services. Faisons connaissance d'abord 👇
|
||||
|
||||
section
|
||||
h2 # nos valeurs
|
||||
|
||||
section(style="padding-left:1.5rem")
|
||||
h3 ⇨ protèger la vie privée
|
||||
h3 ⇨ défendre la liberté d'expression
|
||||
h3 ⇨ ne pas se laisser manipuler
|
||||
h3 ⇨ choisir la sobriété numérique
|
||||
h3 ⇨ prendre les décisions ensemble
|
||||
h3 ⇨ mettre en commun nos connaissances et nos infrastructures
|
||||
|
||||
section
|
||||
h2 # nos articles
|
||||
|
||||
article.frame
|
||||
p.right
|
||||
em Par Quentin, le 20 avril 2020
|
||||
h4
|
||||
a(href="https://quentin.dufour.io/blog/2020-04-20/stopcovid/") StopCovid : anonymat et autorités
|
||||
p
|
||||
| "StopCovid sera totalement anonyme. L'État ne pourra rien savoir sur vous." Non, c'est FAUX, l'État connaitra votre identité et pourrait vous assigner à résidence sans recours possible. Nous vous expliquons pourquoi en nous basant sur le document technique de l'application.
|
||||
|
|
||||
a(href="https://quentin.dufour.io/blog/2020-04-20/stopcovid/") Lire la suite.
|
||||
|
||||
section
|
||||
h2 # faisons connaissance
|
||||
p.spacing Nous fonctionnons actuellement selon un mode de cooptation qui nous permet d'une part de mieux contrôler l'utilisation des ressources et éviter les abus, et d'autre part de créer et garder un contact humain avec nos utilisateurs.
|
||||
p.spacing
|
||||
| Si vous connaissez un membre de l'association, contactez le directement pour qu'il vous créer un compte.
|
||||
br
|
||||
| Sinon, vous pouvez nous écrire à coucou<img class="simple" src="img/arobase.png" height="15"/>deuxfleurs.fr.
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<clientConfig version="1.1">
|
||||
<emailProvider id="deuxfleurs.fr">
|
||||
<domain>deuxfleurs.fr</domain>
|
||||
<displayName>Deuxfleurs Mail</displayName>
|
||||
<displayShortName>Deuxfleurs</displayShortName>
|
||||
<incomingServer type="imap">
|
||||
<hostname>imap.deuxfleurs.fr</hostname>
|
||||
<port>993</port>
|
||||
<socketType>SSL</socketType>
|
||||
<authentication>plain</authentication>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
</incomingServer>
|
||||
<outgoingServer type="smtp">
|
||||
<hostname>smtp.deuxfleurs.fr</hostname>
|
||||
<port>465</port>
|
||||
<socketType>SSL</socketType>
|
||||
<authentication>plain</authentication>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
</outgoingServer>
|
||||
<documentation url="https://deuxfleurs.fr/Guide/Email.html">
|
||||
<descr lang="fr">Documentation générique pour la configuration</descr>
|
||||
<descr lang="en">Generic settings page</descr>
|
||||
</documentation>
|
||||
</emailProvider>
|
||||
</clientConfig>
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
file.class = service
|
||||
file.protocol = ChatonsInfos-0.5
|
||||
file.datetime = 2022-07-20T00:00:00
|
||||
file.generator = L'équipe Deuxfleurs
|
||||
service.name = Cryptpad
|
||||
service.description = Pads, sondages, tableurs collaboratifs et chiffrés
|
||||
service.website = https://pad.deuxfleurs.fr
|
||||
service.logo = https://deuxfleurs.fr/.well-known/chatonsinfos/deuxfleurs.svg
|
||||
service.legal.url = https://deuxfleurs.fr/Mentions%20l%C3%A9gales.html
|
||||
service.guide.technical = https://guide.deuxfleurs.fr/operations/
|
||||
service.guide.user = https://guide.deuxfleurs.fr/prise_en_main/cryptpad/
|
||||
service.contact.url = https://deuxfleurs.fr/
|
||||
service.contact.email = coucou@deuxfleurs.fr
|
||||
service.startdate = 01/01/2020
|
||||
service.status.level = OK
|
||||
service.registration = None
|
||||
service.registration.load = OPEN
|
||||
service.install.type = SOURCES
|
||||
software.name = cryptpad
|
||||
software.website = https://cryptpad.fr/
|
||||
software.license.url = https://github.com/xwiki-labs/cryptpad/blob/main/LICENSE
|
||||
software.license.name = AGPL-3.0
|
||||
software.version = 4.14.1
|
||||
software.source.url = https://github.com/superboum/cryptpad
|
||||
host.name=Deuxfleurs
|
||||
host.server.distribution=NixOS
|
||||
host.server.type=PHYSICAL
|
||||
host.provider.type=HOME
|
||||
host.country.code=FR
|
||||
host.country.name=France
|
|
@ -1,28 +0,0 @@
|
|||
file.class = organization
|
||||
file.protocol = ChatonsInfos-0.5
|
||||
file.datetime = 2022-07-20T00:00:00
|
||||
file.generator = L'équipe Deuxfleurs
|
||||
organization.name = Deuxfleurs
|
||||
organization.description = Fabriquons un internet convivial
|
||||
#organization.type = ASSOCIATION
|
||||
organization.website = https://deuxfleurs.fr
|
||||
organization.logo = https://deuxfleurs.fr/.well-known/chatonsinfos/deuxfleurs.svg
|
||||
organization.socialnetworks.plume = https://plume.deuxfleurs.fr/~/Deuxfleurs
|
||||
organization.socialnetworks.twitter = https://twitter.com/deuxfleurs_org/
|
||||
organization.chatrooms.matrix = https://matrix.to/#/#deuxfleurs:deuxfleurs.fr
|
||||
organization.contact.url = https://deuxfleurs.fr
|
||||
organization.contact.email = coucou@deuxfleurs.fr
|
||||
organization.legal.url = https://deuxfleurs.fr/Mentions%20l%C3%A9gales.html
|
||||
organization.guide.technical = https://guide.deuxfleurs.fr/operations/
|
||||
organization.guide.user = https://guide.deuxfleurs.fr/prise_en_main/
|
||||
organization.status.level = ACTIVE
|
||||
organization.startdate = 01/01/2020
|
||||
organization.memberof.chatons.startdate = 21/06/2022
|
||||
organization.memberof.chatons.status.level = ACTIVE
|
||||
organization.country.name = France
|
||||
organization.country.code = FR
|
||||
subs.jitsi = https://deuxfleurs.fr/.well-known/chatonsinfos/jitsi.properties
|
||||
subs.cryptpad = https://deuxfleurs.fr/.well-known/chatonsinfos/cryptpad.properties
|
||||
subs.matrix = https://deuxfleurs.fr/.well-known/chatonsinfos/matrix.properties
|
||||
subs.plume = https://deuxfleurs.fr/.well-known/chatonsinfos/plume.properties
|
||||
subs.garage = https://deuxfleurs.fr/.well-known/chatonsinfos/garage.properties
|
|
@ -1,91 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 70.424515 70.300102"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="logo.svg"
|
||||
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
|
||||
inkscape:export-filename="/home/quentin/Documents/dev/deuxfleurs/site/src/img/logo.png"
|
||||
inkscape:export-xdpi="699.30194"
|
||||
inkscape:export-ydpi="699.30194"
|
||||
width="70.424515"
|
||||
height="70.300102"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
id="namedview10"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="12.125"
|
||||
inkscape:cx="43.092783"
|
||||
inkscape:cy="48.082474"
|
||||
inkscape:window-width="3072"
|
||||
inkscape:window-height="1659"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8" />
|
||||
<g
|
||||
id="g79969"
|
||||
transform="translate(-0.827,34.992103)">
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="m 15.632,34.661 c -0.799,-0.597 -1.498,-1.484 -2.035,-2.592 l -0.228,-0.47 -0.46,0.249 c -0.975,0.528 -1.913,0.858 -2.744,0.969 L 9.963,29.061 6.327,30.029 C 6.17,29.175 6.202,28.142 6.423,27.007 L 6.526,26.482 5.994,26.416 C 4.752,26.262 3.688,25.891 2.89,25.336 L 4.411,22.419 1.423,20.896 C 1.742,19.952 2.371,19.014 3.257,18.161 L 3.634,17.798 3.255,17.438 C 2.452,16.674 1.847,15.884 1.485,15.127 L 4.995,13.774 2.95,10.615 C 3.69,10.213 4.643,9.929 5.739,9.783 L 6.258,9.715 6.167,9.201 C 5.952,7.99 5.995,6.863 6.291,5.913 l 3.308,0.523 0.524,-3.308 c 0.988,0.013 2.08,0.326 3.164,0.907 L 13.749,4.283 13.975,3.81 C 14.454,2.807 15.019,1.986 15.628,1.406 L 18,4.326 20.372,1.406 c 0.609,0.58 1.175,1.401 1.653,2.404 l 0.226,0.473 0.462,-0.247 C 23.798,3.455 24.891,3.142 25.877,3.13 L 26.4,6.438 29.71,5.913 c 0.296,0.951 0.34,2.078 0.124,3.288 l -0.092,0.515 0.518,0.069 c 1.095,0.145 2.048,0.43 2.788,0.832 l -2.046,3.156 3.511,1.355 c -0.361,0.757 -0.966,1.547 -1.77,2.311 l -0.379,0.36 0.377,0.363 c 0.888,0.854 1.516,1.793 1.835,2.736 l -2.984,1.52 1.521,2.984 c -0.812,0.574 -1.871,0.964 -3.094,1.134 l -0.518,0.072 0.096,0.514 c 0.201,1.089 0.226,2.083 0.073,2.909 l -3.634,-0.97 -0.204,3.757 c -0.83,-0.11 -1.768,-0.44 -2.742,-0.968 l -0.459,-0.249 -0.228,0.47 c -0.539,1.107 -1.237,1.994 -2.036,2.591 L 18,32.293 Z"
|
||||
id="path2" />
|
||||
<path
|
||||
d="M 7.092,10.678 C 6.562,9.189 6.394,7.708 6.66,6.478 l 2.368,0.375 0.987,0.156 0.157,-0.988 0.375,-2.368 C 11.808,3.78 13.16,4.396 14.409,5.359 14.527,5.022 14.653,4.696 14.791,4.392 13.24,3.257 11.568,2.629 10.061,2.629 9.938,2.629 9.816,2.633 9.695,2.642 L 9.184,5.865 5.96,5.354 C 5.36,6.841 5.395,8.769 6.045,10.747 6.38,10.71 6.729,10.686 7.092,10.678 Z M 21.593,5.359 c 1.248,-0.962 2.6,-1.578 3.86,-1.705 l 0.376,2.368 0.156,0.988 0.987,-0.157 2.369,-0.376 c 0.266,1.23 0.098,2.71 -0.432,4.2 0.361,0.009 0.711,0.032 1.046,0.07 C 30.606,8.769 30.64,6.841 30.04,5.353 L 26.815,5.865 26.304,2.641 c -0.12,-0.008 -0.242,-0.012 -0.365,-0.012 -1.507,0 -3.179,0.628 -4.73,1.762 0.14,0.306 0.266,0.631 0.384,0.968 z M 7.368,27 h 0.035 c 0.067,0 0.157,-0.604 0.26,-0.947 -0.098,0.004 -0.197,0.046 -0.294,0.046 -1.496,0 -2.826,-0.303 -3.83,-0.89 L 4.628,23.081 5.082,22.194 4.191,21.742 2.055,20.654 C 2.563,19.503 3.57,18.404 4.873,17.511 4.586,17.292 4.312,17.07 4.063,16.842 2.376,18.059 1.217,19.597 0.828,21.152 l 2.908,1.483 -1.482,2.843 C 3.475,26.501 5.303,27 7.368,27 Z m 27.806,-5.846 c -0.39,-1.555 -1.548,-3.093 -3.234,-4.311 -0.25,0.228 -0.523,0.451 -0.81,0.669 1.304,0.893 2.31,1.992 2.817,3.145 l -2.136,1.088 -0.891,0.453 0.454,0.892 1.089,2.137 c -1.004,0.587 -2.332,0.904 -3.828,0.904 -0.099,0 -0.199,-0.01 -0.299,-0.013 0.103,0.344 0.192,0.683 0.26,1.011 l 0.039,0.002 c 2.066,0 3.892,-0.563 5.112,-1.587 l -1.482,-2.908 z m -12.653,9.182 c -0.447,1.517 -1.181,2.812 -2.119,3.651 L 18.707,32.293 18,31.586 l -0.707,0.707 -1.695,1.694 c -0.938,-0.839 -1.673,-2.136 -2.12,-3.652 -0.296,0.206 -0.593,0.397 -0.886,0.563 0.636,1.98 1.741,3.559 3.1,4.409 L 18,33 l 2.308,2.308 c 1.358,-0.851 2.464,-2.428 3.101,-4.408 -0.295,-0.168 -0.591,-0.359 -0.888,-0.564 z"
|
||||
fill="#ea596e"
|
||||
id="path4" />
|
||||
<path
|
||||
fill="#ea596e"
|
||||
d="m 20.118,5.683 c 0.426,1.146 0.748,2.596 0.841,4.284 l 0.2,3.683 3.564,-0.946 c 1.32,-0.351 2.655,-0.536 3.86,-0.536 0.16,0 0.318,0.003 0.474,0.01 l -1.827,2.819 3.139,1.211 c -0.958,0.759 -2.237,1.514 -3.814,2.123 l -3.441,1.328 2.001,3.099 c 0.918,1.42 1.509,2.782 1.838,3.96 L 23.709,25.853 23.527,29.21 C 22.508,28.533 21.395,27.55 20.329,26.237 L 18,23.374 15.672,26.236 c -1.066,1.312 -2.179,2.295 -3.198,2.972 l -0.18,-3.354 -3.248,0.864 c 0.329,-1.178 0.921,-2.54 1.839,-3.961 L 12.889,19.658 9.447,18.33 C 7.87,17.721 6.591,16.967 5.633,16.208 L 8.768,15 6.941,12.177 c 0.155,-0.006 0.313,-0.01 0.473,-0.01 1.206,0 2.541,0.185 3.861,0.536 l 3.564,0.947 0.202,-3.683 c 0.092,-1.688 0.415,-3.138 0.84,-4.284 L 18,8.292 20.118,5.683 M 20.308,0.692 18,3.533 15.692,0.692 C 13.703,2.224 12.271,5.684 12.046,9.804 10.429,9.374 8.854,9.167 7.414,9.167 c -2.11,0 -3.929,0.445 -5.161,1.289 l 1.989,3.073 -3.415,1.316 c 0.842,2.366 3.69,4.797 7.54,6.283 -2.241,3.465 -3.116,7.106 -2.407,9.516 l 3.537,-0.941 0.196,3.654 c 2.512,-0.07 5.703,-2.027 8.307,-5.228 2.603,3.201 5.796,5.158 8.306,5.228 l 0.198,-3.655 3.535,0.943 c 0.71,-2.411 -0.165,-6.05 -2.404,-9.517 3.849,-1.485 6.696,-3.918 7.538,-6.283 l -3.415,-1.318 1.99,-3.07 c -1.233,-0.844 -3.053,-1.29 -5.164,-1.29 -1.438,0 -3.013,0.207 -4.63,0.636 C 23.729,5.684 22.297,2.224 20.308,0.692 Z"
|
||||
id="path6" />
|
||||
</g>
|
||||
<g
|
||||
id="g79964"
|
||||
transform="translate(-1.043816,35.993714)">
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="m 51.92633,-2.0247139 c -0.799,-0.597 -1.498,-1.484 -2.035,-2.592 l -0.228,-0.47 -0.46,0.249 c -0.975,0.528 -1.913,0.858 -2.744,0.969 l -0.202,-3.7560001 -3.636,0.968 c -0.157,-0.854 -0.125,-1.887 0.096,-3.022 l 0.103,-0.525 -0.532,-0.066 c -1.242,-0.154 -2.306,-0.525 -3.104,-1.08 l 1.521,-2.917 -2.988,-1.523 c 0.319,-0.944 0.948,-1.882 1.834,-2.735 l 0.377,-0.363 -0.379,-0.36 c -0.803,-0.764 -1.408,-1.554 -1.77,-2.311 l 3.51,-1.353 -2.045,-3.159 c 0.74,-0.402 1.693,-0.686 2.789,-0.832 l 0.519,-0.068 -0.091,-0.514 c -0.215,-1.211 -0.172,-2.338 0.124,-3.288 l 3.308,0.523 0.524,-3.308 c 0.988,0.013 2.08,0.326 3.164,0.907 l 0.462,0.248 0.226,-0.473 c 0.479,-1.003 1.044,-1.824 1.653,-2.404 l 2.372,2.92 2.372,-2.92 c 0.609,0.58 1.175,1.401 1.653,2.404 l 0.226,0.473 0.462,-0.247 c 1.085,-0.581 2.178,-0.894 3.164,-0.906 l 0.523,3.308 3.31,-0.525 c 0.296,0.951 0.34,2.078 0.124,3.288 l -0.092,0.515 0.518,0.069 c 1.095,0.145 2.048,0.43 2.788,0.832 l -2.046,3.156 3.511,1.355 c -0.361,0.757 -0.966,1.547 -1.77,2.311 l -0.379,0.36 0.377,0.363 c 0.888,0.854 1.516,1.793 1.835,2.736 l -2.984,1.52 1.521,2.984 c -0.812,0.574 -1.871,0.964 -3.094,1.134 l -0.518,0.072 0.096,0.514 c 0.201,1.089 0.226,2.083 0.073,2.909 l -3.634,-0.97 -0.204,3.7570001 c -0.83,-0.11 -1.768,-0.44 -2.742,-0.968 l -0.459,-0.249 -0.228,0.47 c -0.539,1.107 -1.237,1.994 -2.036,2.591 l -2.367,-2.369 z"
|
||||
id="path2-9" />
|
||||
<path
|
||||
d="m 43.38633,-26.007714 c -0.53,-1.489 -0.698,-2.97 -0.432,-4.2 l 2.368,0.375 0.987,0.156 0.157,-0.988 0.375,-2.368 c 1.261,0.127 2.613,0.743 3.862,1.706 0.118,-0.337 0.244,-0.663 0.382,-0.967 -1.551,-1.135 -3.223,-1.763 -4.73,-1.763 -0.123,0 -0.245,0.004 -0.366,0.013 l -0.511,3.223 -3.224,-0.511 c -0.6,1.487 -0.565,3.415 0.085,5.393 0.335,-0.037 0.684,-0.061 1.047,-0.069 z m 14.501,-5.319 c 1.248,-0.962 2.6,-1.578 3.86,-1.705 l 0.376,2.368 0.156,0.988 0.987,-0.157 2.369,-0.376 c 0.266,1.23 0.098,2.71 -0.432,4.2 0.361,0.009 0.711,0.032 1.046,0.07 0.651,-1.978 0.685,-3.906 0.085,-5.394 l -3.225,0.512 -0.511,-3.224 c -0.12,-0.008 -0.242,-0.012 -0.365,-0.012 -1.507,0 -3.179,0.628 -4.73,1.762 0.14,0.306 0.266,0.631 0.384,0.968 z m -14.225,21.641 h 0.035 c 0.067,0 0.157,-0.604 0.26,-0.947 -0.098,0.004 -0.197,0.046 -0.294,0.046 -1.496,0 -2.826,-0.303 -3.83,-0.89 l 1.089,-2.128 0.454,-0.887 -0.891,-0.452 -2.136,-1.088 c 0.508,-1.151 1.515,-2.25 2.818,-3.143 -0.287,-0.219 -0.561,-0.441 -0.81,-0.669 -1.687,1.217 -2.846,2.755 -3.235,4.31 l 2.908,1.483 -1.482,2.843 c 1.221,1.023 3.049,1.522 5.114,1.522 z m 27.806,-5.846 c -0.39,-1.555 -1.548,-3.093 -3.234,-4.311 -0.25,0.228 -0.523,0.451 -0.81,0.669 1.304,0.893 2.31,1.992 2.817,3.145 l -2.136,1.088 -0.891,0.453 0.454,0.892 1.089,2.137 c -1.004,0.587 -2.332,0.904 -3.828,0.904 -0.099,0 -0.199,-0.01 -0.299,-0.013 0.103,0.344 0.192,0.683 0.26,1.011 l 0.039,0.002 c 2.066,0 3.892,-0.563 5.112,-1.587 l -1.482,-2.908 z m -12.653,9.182 c -0.447,1.5170001 -1.181,2.8120001 -2.119,3.6510001 l -1.695,-1.694 -0.707,-0.707 -0.707,0.707 -1.695,1.694 c -0.938,-0.839 -1.673,-2.136 -2.12,-3.6520001 -0.296,0.2060001 -0.593,0.3970001 -0.886,0.5630001 0.636,1.98 1.741,3.559 3.1,4.409 l 2.308,-2.307 2.308,2.308 c 1.358,-0.851 2.464,-2.428 3.101,-4.408 -0.295,-0.168 -0.591,-0.359 -0.888,-0.5640001 z"
|
||||
fill="#ea596e"
|
||||
id="path4-3" />
|
||||
<path
|
||||
fill="#ea596e"
|
||||
d="m 56.41233,-31.002714 c 0.426,1.146 0.748,2.596 0.841,4.284 l 0.2,3.683 3.564,-0.946 c 1.32,-0.351 2.655,-0.536 3.86,-0.536 0.16,0 0.318,0.003 0.474,0.01 l -1.827,2.819 3.139,1.211 c -0.958,0.759 -2.237,1.514 -3.814,2.123 l -3.441,1.328 2.001,3.099 c 0.918,1.42 1.509,2.782 1.838,3.96 l -3.244,-0.865 -0.182,3.357 c -1.019,-0.677 -2.132,-1.66 -3.198,-2.973 l -2.329,-2.863 -2.328,2.862 c -1.066,1.312 -2.179,2.295 -3.198,2.972 l -0.18,-3.354 -3.248,0.864 c 0.329,-1.178 0.921,-2.54 1.839,-3.961 l 2.004,-3.099 -3.442,-1.328 c -1.577,-0.609 -2.856,-1.363 -3.814,-2.122 l 3.135,-1.208 -1.827,-2.823 c 0.155,-0.006 0.313,-0.01 0.473,-0.01 1.206,0 2.541,0.185 3.861,0.536 l 3.564,0.947 0.202,-3.683 c 0.092,-1.688 0.415,-3.138 0.84,-4.284 l 2.119,2.609 2.118,-2.609 m 0.19,-4.991 -2.308,2.841 -2.308,-2.841 c -1.989,1.532 -3.421,4.992 -3.646,9.112 -1.617,-0.43 -3.192,-0.637 -4.632,-0.637 -2.11,0 -3.929,0.445 -5.161,1.289 l 1.989,3.073 -3.415,1.316 c 0.842,2.366 3.69,4.797 7.54,6.283 -2.241,3.465 -3.116,7.106 -2.407,9.5160001 l 3.537,-0.9410001 0.196,3.6540001 c 2.512,-0.07 5.703,-2.027 8.307,-5.2280001 2.603,3.2010001 5.796,5.1580001 8.306,5.2280001 l 0.198,-3.6550001 3.535,0.9430001 c 0.71,-2.4110001 -0.165,-6.0500001 -2.404,-9.5170001 3.849,-1.485 6.696,-3.918 7.538,-6.283 l -3.415,-1.318 1.99,-3.07 c -1.233,-0.844 -3.053,-1.29 -5.164,-1.29 -1.438,0 -3.013,0.207 -4.63,0.636 -0.225,-4.119 -1.657,-7.579 -3.646,-9.111 z"
|
||||
id="path6-6" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:42.6667px;line-height:1.25;font-family:sans-serif;fill:#ea596e;fill-opacity:1;stroke:none"
|
||||
x="2.2188232"
|
||||
y="31.430677"
|
||||
id="text46212"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan46210"
|
||||
x="2.2188232"
|
||||
y="31.430677"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:42.6667px;font-family:'TeX Gyre Termes';-inkscape-font-specification:'TeX Gyre Termes'">D</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:42.6667px;line-height:1.25;font-family:sans-serif;fill:#ea596e;fill-opacity:1;stroke:none"
|
||||
x="41.347008"
|
||||
y="67.114784"
|
||||
id="text46212-1"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan46210-5"
|
||||
x="41.347008"
|
||||
y="67.114784"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:42.6667px;font-family:'TeX Gyre Termes';-inkscape-font-specification:'TeX Gyre Termes'">F</tspan></text>
|
||||
</svg>
|
Before Width: | Height: | Size: 12 KiB |
|
@ -1,30 +0,0 @@
|
|||
file.class = service
|
||||
file.protocol = ChatonsInfos-0.5
|
||||
file.datetime = 2022-07-20T00:00:00
|
||||
file.generator = L'équipe Deuxfleurs
|
||||
service.name = Hébergement site statique
|
||||
service.description = Hébergez votre blog, site vitrine ou n'importe quel site statique
|
||||
service.website = https://guide.deuxfleurs.fr/prise_en_main/web/
|
||||
service.logo = https://deuxfleurs.fr/.well-known/chatonsinfos/deuxfleurs.svg
|
||||
service.legal.url = https://deuxfleurs.fr/Mentions%20l%C3%A9gales.html
|
||||
service.guide.technical = https://guide.deuxfleurs.fr/operations/
|
||||
service.guide.user = https://guide.deuxfleurs.fr/prise_en_main/web/
|
||||
service.contact.url = https://deuxfleurs.fr/
|
||||
service.contact.email = coucou@deuxfleurs.fr
|
||||
service.startdate = 01/01/2020
|
||||
service.status.level = OK
|
||||
service.registration = Member
|
||||
service.registration.load = OPEN
|
||||
service.install.type = SOURCES
|
||||
software.name = Garage
|
||||
software.website = https://garagehq.deuxfleurs.fr/
|
||||
software.license.url = https://git.deuxfleurs.fr/Deuxfleurs/garage/src/branch/main/LICENSE
|
||||
software.license.name = AGPL-3.0
|
||||
software.version = 0.7.2
|
||||
software.source.url = https://git.deuxfleurs.fr/Deuxfleurs/garage
|
||||
host.name=Deuxfleurs
|
||||
host.server.distribution=NixOS
|
||||
host.server.type=PHYSICAL
|
||||
host.provider.type=HOME
|
||||
host.country.code=FR
|
||||
host.country.name=France
|
|
@ -1,30 +0,0 @@
|
|||
file.class = service
|
||||
file.protocol = ChatonsInfos-0.5
|
||||
file.datetime = 2022-07-20T00:00:00
|
||||
file.generator = L'équipe Deuxfleurs
|
||||
service.name = Jitsi
|
||||
service.description = Visioconférence dans le navigateur et sur mobile
|
||||
service.website = https://jitsi.deuxfleurs.fr
|
||||
service.logo = https://deuxfleurs.fr/.well-known/chatonsinfos/deuxfleurs.svg
|
||||
service.legal.url = https://deuxfleurs.fr/Mentions%20l%C3%A9gales.html
|
||||
service.guide.technical = https://guide.deuxfleurs.fr/operations/
|
||||
service.guide.user = https://guide.deuxfleurs.fr/prise_en_main/jitsi/
|
||||
service.contact.url = https://deuxfleurs.fr/
|
||||
service.contact.email = coucou@deuxfleurs.fr
|
||||
service.startdate = 01/01/2020
|
||||
service.status.level = OK
|
||||
service.registration = None
|
||||
service.registration.load = OPEN
|
||||
service.install.type = SOURCES
|
||||
software.name = jitsimeet
|
||||
software.website = https://jitsi.org/jitsi-meet/
|
||||
software.license.url = https://github.com/jitsi/jitsi-meet/blob/master/LICENSE
|
||||
software.license.name = Apache License 2.0
|
||||
software.version = 6826
|
||||
software.source.url = https://git.deuxfleurs.fr/Deuxfleurs/infrastructure/src/branch/main/app/jitsi/build
|
||||
host.name=Deuxfleurs
|
||||
host.server.distribution=NixOS
|
||||
host.server.type=PHYSICAL
|
||||
host.provider.type=HOME
|
||||
host.country.code=FR
|
||||
host.country.name=France
|
|
@ -1,30 +0,0 @@
|
|||
file.class = service
|
||||
file.protocol = ChatonsInfos-0.5
|
||||
file.datetime = 2022-07-20T00:00:00
|
||||
file.generator = L'équipe Deuxfleurs
|
||||
service.name = Matrix
|
||||
service.description = Discussions instantanées chiffrées et en groupe
|
||||
service.website = https://riot.deuxfleurs.fr
|
||||
service.logo = https://deuxfleurs.fr/.well-known/chatonsinfos/deuxfleurs.svg
|
||||
service.legal.url = https://deuxfleurs.fr/Mentions%20l%C3%A9gales.html
|
||||
service.guide.technical = https://guide.deuxfleurs.fr/operations/
|
||||
service.guide.user = https://guide.deuxfleurs.fr/prise_en_main/matrix/
|
||||
service.contact.url = https://deuxfleurs.fr/
|
||||
service.contact.email = coucou@deuxfleurs.fr
|
||||
service.startdate = 01/01/2020
|
||||
service.status.level = OK
|
||||
service.registration = Member
|
||||
service.registration.load = OPEN
|
||||
service.install.type = SOURCES
|
||||
software.name = Synapse
|
||||
software.website = https://matrix-org.github.io/synapse/latest/
|
||||
software.license.url = https://github.com/matrix-org/synapse/blob/develop/LICENSE
|
||||
software.license.name = Apache-2.0
|
||||
software.version = 1.61.1
|
||||
software.source.url = https://github.com/matrix-org/synapse
|
||||
host.name=Deuxfleurs
|
||||
host.server.distribution=NixOS
|
||||
host.server.type=PHYSICAL
|
||||
host.provider.type=HOME
|
||||
host.country.code=FR
|
||||
host.country.name=France
|
|
@ -1,30 +0,0 @@
|
|||
file.class = service
|
||||
file.protocol = ChatonsInfos-0.5
|
||||
file.datetime = 2022-07-20T00:00:00
|
||||
file.generator = L'équipe Deuxfleurs
|
||||
service.name = Plume
|
||||
service.description = Plateforme de blog fédérée via ActivityPub
|
||||
service.website = https://plume.deuxfleurs.fr/
|
||||
service.logo = https://deuxfleurs.fr/.well-known/chatonsinfos/deuxfleurs.svg
|
||||
service.legal.url = https://deuxfleurs.fr/Mentions%20l%C3%A9gales.html
|
||||
service.guide.technical = https://guide.deuxfleurs.fr/operations/
|
||||
service.guide.user = https://guide.deuxfleurs.fr/prise_en_main/plume/
|
||||
service.contact.url = https://deuxfleurs.fr/
|
||||
service.contact.email = coucou@deuxfleurs.fr
|
||||
service.startdate = 01/01/2020
|
||||
service.status.level = OK
|
||||
service.registration = Member
|
||||
service.registration.load = OPEN
|
||||
service.install.type = SOURCES
|
||||
software.name = Plume
|
||||
software.website = https://joinplu.me/
|
||||
software.license.url = https://git.joinplu.me/Plume/Plume/src/branch/main/LICENSE
|
||||
software.license.name = AGPL-3.0
|
||||
software.version = 8709f6cf9f8ff7e3c5ee7ea699ee7c778e92fefc
|
||||
software.source.url = https://git.joinplu.me/Plume/Plume
|
||||
host.name=Deuxfleurs
|
||||
host.server.distribution=NixOS
|
||||
host.server.type=PHYSICAL
|
||||
host.provider.type=HOME
|
||||
host.country.code=FR
|
||||
host.country.name=France
|
|
@ -1 +0,0 @@
|
|||
{ "m.server": "im.deuxfleurs.fr:443" }
|
|
@ -1,9 +0,0 @@
|
|||
<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><title>💮💮 deuxfleurs</title></head>
|
||||
<body>
|
||||
<p>Erreur 404 - page non trouvée, cette page n'existe pas (ou a été déplacée, j'en sais rien moi !)</p>
|
||||
<p>Est-ce que tu cherches la <a href="https://deuxfleurs.fr/">page d'accueil</a> ?
|
||||
Le <a href="https://guide.deuxfleurs.fr/">guide</a> ?
|
||||
Le <a href="https://guichet.deuxfleurs.fr/">guichet</a> ?
|
||||
Les <a href="https://plume.deuxfleurs.fr/">big news de l'espace</a> ?</p>
|
||||
<p>Si tu es toujours paumé⋅e, viens nous parler sur Matrix ou écris à <code>coucou@deuxfleurs.fr</code>!</p>
|
||||
</body></html>
|
593
static/cgu.html
|
@ -1,575 +0,0 @@
|
|||
/*GESTION DE LA GRILLE DE LA PAGE PRINCIPALE */
|
||||
main {
|
||||
grid-area: main-row-debut / main-col-start / main-row-fin / main-col-sep 12;
|
||||
|
||||
display: grid;
|
||||
grid-template-columns: [col-start] repeat(12, calc(100% / 12) [col-sep]);
|
||||
grid-template-rows:
|
||||
[row-start] auto [jardin-end]
|
||||
repeat(3, var(--big_margin) [title-start] auto [title-end] var(--med_margin) [illu-start] auto [illu-end] auto [illu-extended-end] var(--med_margin) [txt-start] auto [txt-end])
|
||||
var(--big_margin)
|
||||
[title-start-contact] auto [title-end-contact]
|
||||
var(--med_margin)
|
||||
[txt-start-contact] auto [txt-end-contact] auto [cal-end-contact] /* au lieu de mettre auto on pourrait mettre 100px ici pour avoir les 2 cadres de la même taille*/
|
||||
;
|
||||
}
|
||||
|
||||
div#jardin {
|
||||
background-color: var(--jardin);
|
||||
grid-area: row-start / col-start / jardin-end / col-sep 12;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
div#jardin p {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
h2#infras {
|
||||
background-color: var(--infras);
|
||||
grid-area: title-start 1 / col-sep 1 / title-end 1 / col-sep 12;
|
||||
padding-bottom: 10px; /* Ajoutez de l'espace en dessous du texte */
|
||||
}
|
||||
|
||||
div#rennes {
|
||||
background-color: var(--rennes);
|
||||
grid-area: illu-start 1 / col-sep 1 / illu-end 1 / col-sep 6;
|
||||
overflow: hidden;
|
||||
/*height: 450px;*/
|
||||
}
|
||||
|
||||
div#orsay {
|
||||
background-color: var(--orsay);
|
||||
grid-area: illu-start 1 / col-sep 6 / illu-end 1 / col-sep 11;
|
||||
overflow: hidden;
|
||||
/*height:450px;*/
|
||||
}
|
||||
|
||||
p#txt_infras {
|
||||
background-color: var(--txt_infras);
|
||||
grid-area: txt-start 1 / col-sep 1 / txt-end 1 / col-sep 7;
|
||||
}
|
||||
|
||||
h2#outils {
|
||||
background-color: var(--outils);
|
||||
grid-area: title-start 2 / col-sep 1 / title-end 2 / col-sep 12;
|
||||
}
|
||||
|
||||
section#liste_outils {
|
||||
background-color: var(--liste_outils);
|
||||
grid-area: illu-start 2 / col-sep 7 / illu-end 2 / col-sep 11;
|
||||
}
|
||||
|
||||
section#liste_outils > a > div > p {
|
||||
text-align: center;
|
||||
text-decoration: underline;
|
||||
color: darkgreen;
|
||||
}
|
||||
|
||||
section#liste_outils > a {
|
||||
/*display: contents;*/
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
section#liste_outils > a:hover {
|
||||
color: darkgreen;
|
||||
}
|
||||
|
||||
div#txt_outils {
|
||||
background-color: var(--txt_outils);
|
||||
grid-area: txt-start 2 / col-sep 1 / txt-end 2 / col-sep 7;
|
||||
}
|
||||
|
||||
h2#valeurs {
|
||||
background-color: var(--valeurs);
|
||||
grid-area: title-start 3 / col-sep 1 / title-end 3 / col-sep 12;
|
||||
}
|
||||
|
||||
div#ronce {
|
||||
background-color: var(--ronce);
|
||||
grid-area: illu-start 3 / col-sep 2 / illu-end 3 / col-sep 10;
|
||||
padding: 0.5rem;
|
||||
filter: grayscale(100%);
|
||||
border: 1px dashed black;
|
||||
transition: filter 0.15s ease 0s;
|
||||
}
|
||||
|
||||
div#ronce:hover {
|
||||
filter: none;
|
||||
}
|
||||
|
||||
section#liste_valeurs {
|
||||
background-color: var(--liste_valeurs);
|
||||
grid-area: txt-start 3 / col-sep 2 / txt-end 3 / col-sep 10;
|
||||
}
|
||||
|
||||
h2#connaissance {
|
||||
background-color: var(--connaissance);
|
||||
grid-area: title-start-contact / col-sep 1 / title-end-contact / col-sep 12;
|
||||
}
|
||||
|
||||
div#txt_connaissance {
|
||||
background-color: var(--txt_connaissance);
|
||||
grid-area: txt-start-contact / col-sep 1 / txt-end-contact / col-sep 6;
|
||||
}
|
||||
|
||||
div#calendrier {
|
||||
background-color: var(--calendrier);
|
||||
grid-area: txt-start-contact / col-sep 7 / txt-end-contact / col-sep 10;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mois_actuel,
|
||||
.mois_suivant {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/*GESTION DE LA GRILLE LISTE DE NOS VALEURS*/
|
||||
|
||||
section#liste_valeurs {
|
||||
/*on ne peut pas faire plusieurs opérations en même temps dans calc, il faut un calc par opération*/
|
||||
--demie-goutiere: calc(var(--small_margin) / 2);
|
||||
--valeurs_width: calc(50% - var(--demie-goutiere));
|
||||
display: grid;
|
||||
grid-template-columns:
|
||||
[col2-start] var(--valeurs_width) [col2-mid-left] /*bloc de gauche*/
|
||||
var(--small_margin) /*goutière*/
|
||||
[col2-mid-right] var(--valeurs_width) [col2-end]; /*bloc de droite*/
|
||||
grid-template-rows:
|
||||
[line1-start] auto [line1-end]
|
||||
var(--small_margin)
|
||||
[line2-start] auto [line2-end]
|
||||
var(--small_margin)
|
||||
[suivre-start] auto [suivre-end]
|
||||
;
|
||||
}
|
||||
|
||||
p#coop {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line1-start / col2-start / line1-end / col2-mid-left;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
p#autonomie {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line1-start / col2-mid-right / line1-end / col2-end;
|
||||
}
|
||||
|
||||
p#solidarite {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line2-start / col2-start / line2-end / col2-mid-left;
|
||||
}
|
||||
|
||||
p#liberte {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line2-start / col2-mid-right / line2-end / col2-end;
|
||||
}
|
||||
|
||||
p#suivre {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: suivre-start / col2-start / suivre-end / col2-end;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#coop,
|
||||
#autonomie,
|
||||
#solidarite,
|
||||
#liberte {
|
||||
padding: 2rem;
|
||||
border: 1px dashed black;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
section#liste_outils {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
column-gap: 1rem;
|
||||
row-gap: 1rem;
|
||||
}
|
||||
|
||||
section#liste_outils > a > div {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
div#ordinateur {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: illu-start 2 / col-start / illu-end 2 / col-sep 7;
|
||||
}
|
||||
|
||||
div#discussion {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line1-start / col-start / line1-end / col-mid-left;
|
||||
}
|
||||
|
||||
div#visio {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line2-start / col-start / line2-end / col-mid-left;
|
||||
}
|
||||
|
||||
div#sites-web {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line3-start / col-start / line3-end / col-mid-left;
|
||||
}
|
||||
|
||||
div#emails {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line1-start / col-mid-right / line1-end / col-end;
|
||||
}
|
||||
|
||||
div#collaboration {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line2-start / col-mid-right / line2-end / col-end;
|
||||
}
|
||||
|
||||
div#blog {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line3-start / col-mid-right / line3-end / col-end;
|
||||
}
|
||||
|
||||
/*GESTION DES MEDIA QUERIES*/
|
||||
|
||||
/*Tablettes et petits ordinateurs*/
|
||||
@media (max-width: 1500px) and (min-width: 801px) {
|
||||
h2#infras {
|
||||
grid-area: title-start 1 / col-sep 1 / title-end 1 / col-sep 12;
|
||||
}
|
||||
|
||||
h2#outils {
|
||||
grid-area: title-start 2 / col-sep 1 / title-end 2 / col-sep 12;
|
||||
}
|
||||
|
||||
h2#valeurs {
|
||||
grid-area: title-start 3 / col-sep 1 / title-end 3 / col-sep 12;
|
||||
}
|
||||
|
||||
h2#connaissance {
|
||||
grid-area: title-start-contact / col-sep 1 / title-end-contact / col-sep 12;
|
||||
}
|
||||
|
||||
div#rennes {
|
||||
grid-area: illu-start 1 / col-sep 2 / illu-end 1 / col-sep 6;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
|
||||
div#orsay {
|
||||
grid-area: illu-start 1 / col-sep 6 / illu-end 1 / col-sep 10;
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
|
||||
div#rennes,
|
||||
div#orsay {
|
||||
border: 1px solid black;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
div#rennes pre.center,
|
||||
div#orsay pre.center {
|
||||
margin-top: -5px;
|
||||
margin-bottom: -5px;
|
||||
}
|
||||
|
||||
div#orsay pre.center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
p#txt_infras {
|
||||
background-color: var(--txt_infras);
|
||||
grid-area: txt-start 1 / col-sep 2 / txt-end 1 / col-sep 10;
|
||||
}
|
||||
|
||||
div#txt_outils {
|
||||
background-color: var(--txt_outils);
|
||||
grid-area: txt-start 2 / col-sep 2 / txt-end 2 / col-sep 10;
|
||||
}
|
||||
|
||||
div#txt_connaissance {
|
||||
grid-area: txt-start-contact / col-sep 2 / txt-end-contact / col-sep 10;
|
||||
}
|
||||
|
||||
div#txt_connaissance ul {
|
||||
padding-left: 0px;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
div#ordinateur {
|
||||
grid-area: illu-start 2 / col-sep 1 / illu-end 2 / col-sep 11;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
section#liste_outils {
|
||||
background-color: var(--liste_outils);
|
||||
grid-area: illu-end 2 / col-sep 1 / illu-extended-end 2 / col-sep 11;
|
||||
margin-top: var(--med_margin);
|
||||
}
|
||||
|
||||
section#liste_outils {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
row-gap: 1rem;
|
||||
column-gap: 1rem;
|
||||
}
|
||||
|
||||
div#discussion {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line1-start / col-tiers1-start / line1-end / col-tiers1-end;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
div#emails {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line1-start / col-tiers2-start / line1-end / col-tiers2-start;
|
||||
}
|
||||
|
||||
div#visio {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line1-start / col-tiers3-start / line1-end / col-tiers3-end;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
div#sites-web {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line2-start / col-tiers1-start / line2-end / col-tiers1-end;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
div#collaboration {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line2-start / col-tiers2-start / line2-end / col-tiers2-end;
|
||||
}
|
||||
|
||||
div#blog {
|
||||
background-color: var(--lightgrey);
|
||||
grid-area: line2-start / col-tiers3-start / line2-end / col-tiers3-end;
|
||||
}
|
||||
|
||||
div#ronce {
|
||||
grid-area: illu-start 3 / col-sep 1 / illu-end 3 / col-sep 11;
|
||||
}
|
||||
|
||||
div#calendrier {
|
||||
margin-top: var(--med_margin);
|
||||
grid-area: txt-end-contact / col-sep 1 / cal-end-contact / col-sep 11;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
#mois_actuel,
|
||||
#mois_suivant {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#mois_actuel {
|
||||
margin-bottom: 0px;
|
||||
margin-right: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
/*Smartphones*/
|
||||
@media (max-width: 800px) {
|
||||
h2#infras {
|
||||
grid-area: title-start 1 / col-start / title-end 1 / col-sep 12;
|
||||
}
|
||||
|
||||
h2#outils {
|
||||
grid-area: title-start 2 / col-start / title-end 2 / col-sep 12;
|
||||
}
|
||||
|
||||
h2#valeurs {
|
||||
grid-area: title-start 3 / col-start / title-end 3 / col-sep 12;
|
||||
}
|
||||
|
||||
h2#connaissance {
|
||||
grid-area: title-start-contact / col-start / title-end-contact / col-sep 12;
|
||||
}
|
||||
|
||||
div#jardin {
|
||||
grid-area: row-start / col-sep 1 / jardin-end / col-sep 11;
|
||||
}
|
||||
|
||||
nav#menu {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
right: 0px;
|
||||
bottom: 0px;
|
||||
padding-bottom: 1rem;
|
||||
background-color: --day-background;
|
||||
z-index: 1;
|
||||
border-top: black 1px dashed;
|
||||
}
|
||||
|
||||
nav#menu ul {
|
||||
list-style: none;
|
||||
flex-direction: row;
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div#txt_connaissance ul {
|
||||
padding-left: 0px;
|
||||
list-style-position: inside;
|
||||
margin-bottom: var(--med_margin);
|
||||
}
|
||||
|
||||
.icone > pre {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
#illustration-accueil > pre.center {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
div#orsay {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div#rennes {
|
||||
grid-area: illu-start 1 / col-sep 1 / illu-end 1 / col-sep 11;
|
||||
border: 1px solid black;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
div#rennes pre {
|
||||
margin-top: -5px;
|
||||
margin-bottom: -5px;
|
||||
}
|
||||
|
||||
pre {
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
#txt_infras,
|
||||
#txt_outils,
|
||||
#txt_connaissance {
|
||||
text-align: left;
|
||||
hyphens: none;
|
||||
margin-top: 0;
|
||||
hyphens: none;
|
||||
word-spacing: -2px;
|
||||
-ms-hyphens: none;
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
p#txt_infras {
|
||||
background-color: var(--txt_infras);
|
||||
grid-area: txt-start 1 / col-sep 1 / txt-end 1 / col-sep 11;
|
||||
}
|
||||
|
||||
div#txt_outils {
|
||||
background-color: var(--txt_outils);
|
||||
grid-area: txt-start 2 / col-sep 1 / txt-end 2 / col-sep 11;
|
||||
}
|
||||
|
||||
div#txt_connaissance {
|
||||
grid-area: txt-start-contact / col-sep 1 / txt-end-contact / col-sep 11;
|
||||
}
|
||||
|
||||
div#ordinateur {
|
||||
display: none;
|
||||
}
|
||||
|
||||
section#liste_outils {
|
||||
display: block;
|
||||
}
|
||||
|
||||
section#liste_outils {
|
||||
grid-area: illu-start 2 / col-start / illu-end 2 / col-sep 12;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
section#liste_outils pre {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
section#liste_outils > a > div {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
div#ronce {
|
||||
grid-area: illu-start 3 / col-sep 1 / illu-end 3 / col-sep 11;
|
||||
border: none;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#coop,
|
||||
#autonomie,
|
||||
#solidarite,
|
||||
#liberte {
|
||||
padding: 1rem;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#suivre {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
section#liste_valeurs {
|
||||
grid-area: txt-start 3 / col-sep 1 / txt-end 3 / col-sep 11;
|
||||
}
|
||||
|
||||
section#liste_valeurs .description {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div#calendrier {
|
||||
grid-area: txt-end-contact / col-sep 1 / cal-end-contact / col-sep 11;
|
||||
display: none;
|
||||
}
|
||||
|
||||
div#calendrier > pre.center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
footer pre.center {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
#liens {
|
||||
text-align: center;
|
||||
margin-bottom: 12rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* En vrac */
|
||||
div#calendrier > pre.center {
|
||||
justify-content: right;
|
||||
}
|
||||
|
||||
#calendrier #mois_actuel {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
#mois_actuel,
|
||||
#mois_suivant {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#txt_connaissance li {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
#txt_connaissance p {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
#txt_infras,
|
||||
#txt_outils,
|
||||
#txt_connaissance {
|
||||
line-height: 1.3rem;
|
||||
text-align: justify;
|
||||
text-justify: inter-character;
|
||||
hyphens: auto;
|
||||
word-spacing: -2px;
|
||||
-ms-hyphens: auto;
|
||||
-webkit-hyphens: auto;
|
||||
-moz-hyphens: auto;
|
||||
margin-top: 0;
|
||||
}
|
|
@ -1,277 +0,0 @@
|
|||
/*PARAMETRES GENERAUX*/
|
||||
:root {
|
||||
--big_margin: 100px;
|
||||
--med_margin: 50px;
|
||||
--small_margin: 10px;
|
||||
--day-background: #fdfff9;
|
||||
--day-highlight-color: white;
|
||||
--day-highlight-bg: darkgreen;
|
||||
--night-highlight-color: #ebebed;
|
||||
--night-highlight-bg: #565a4d;
|
||||
--night-background: #242526; /*#3c3c39;*/
|
||||
--txt-night: #ebebed; /*#c7c4d4;*/
|
||||
color-scheme: light dark;
|
||||
/*
|
||||
--menu: pink;
|
||||
--jardin: darkseagreen;
|
||||
--infras: gold;
|
||||
--rennes: orange;
|
||||
--orsay: chartreuse;
|
||||
--txt_infras: bisque;
|
||||
--outils: coral;
|
||||
--liste_outils: aliceblue;
|
||||
--txt_outils: aquamarine;
|
||||
--valeurs: grey;
|
||||
--ronce: cornflowerblue;
|
||||
--liste_valeurs: brown;
|
||||
--connaissance: chocolate;
|
||||
--txt_connaissance: crimson;
|
||||
--calendrier: darkkhaki;
|
||||
--footer: deeppink;
|
||||
--lightgrey: lightgrey;*/
|
||||
}
|
||||
|
||||
/* PAR DEFAUT */
|
||||
|
||||
h1 > .decoration:last-of-type:before, h2 > .decoration:last-of-type:before{
|
||||
content: '\A____________________________________\A""""""""""""""""""""""""""""""""""""';
|
||||
}
|
||||
|
||||
html, body, main {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: monospace;
|
||||
color: black;
|
||||
background-color: var(--day-background);
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: darkgreen;
|
||||
}
|
||||
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
h2, h1 {
|
||||
font-size: 1rem;
|
||||
font-weight: normal;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h2, h1 {
|
||||
text-transform: uppercase;
|
||||
white-space: pre;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.noscroll {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
color: var(--day-highlight-color);
|
||||
background-color: var(--day-highlight-bg);
|
||||
}
|
||||
|
||||
.underline {
|
||||
text-decoration-line: underline;
|
||||
}
|
||||
|
||||
/*GESTION DE LA GRILLE DU DOCUMENT*/
|
||||
div#container {
|
||||
display: grid;
|
||||
grid-template-columns: [main-col-start] repeat(12, calc(100% / 12) [main-col-sep]);
|
||||
grid-template-rows:
|
||||
[main-row-debut] var(--med_margin)
|
||||
[header-start] auto
|
||||
[header-end] var(--big_margin)
|
||||
[core-start] auto
|
||||
[main-row-fin] var(--big_margin)
|
||||
[footer-start] auto [footer-end]
|
||||
;
|
||||
}
|
||||
|
||||
/* EN-TETE */
|
||||
header {
|
||||
grid-area: header-start / main-col-sep 1 / header-end / main-col-sep 12;
|
||||
z-index: 1; /* Pour le mettre au dessus de l'illustration jardin et que l'on puisse sélectionner son contenu */
|
||||
}
|
||||
|
||||
/* PIED DE PAGE */
|
||||
footer {
|
||||
background-color: var(--footer);
|
||||
grid-area: footer-start / main-col-start / footer-end / main-col-sep 12;
|
||||
}
|
||||
|
||||
#liens {
|
||||
text-align: center;
|
||||
margin-bottom: var(--med_margin);
|
||||
}
|
||||
|
||||
/* MENU */
|
||||
nav#menu {
|
||||
background-color: var(--day-background);
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
flex-direction: column;
|
||||
position: fixed;
|
||||
bottom: 1rem;
|
||||
right: 1rem;
|
||||
}
|
||||
|
||||
.icone > pre {
|
||||
padding-top: 1rem;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.icone {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.icone .img_top {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 99;
|
||||
background-color: var(--day-background);
|
||||
color: darkgreen;
|
||||
}
|
||||
|
||||
.icone:hover .img_top {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.icone a {
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
}
|
||||
|
||||
nav#menu > a {
|
||||
display: block;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
nav#menu > a:hover {
|
||||
color: darkgreen;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* ILLUSTRATIONS ASCII (Y COMPRIS FOOTER) */
|
||||
pre.center {
|
||||
font-size: 1rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
pre.hide {
|
||||
display: none;
|
||||
}
|
||||
pre.center > a {
|
||||
font-size: 1rem;
|
||||
display: contents;
|
||||
text-decoration: 1px black solid;
|
||||
}
|
||||
|
||||
/* RESPONSIVE */
|
||||
/* Tablettes */
|
||||
@media (max-width: 1500px) and (min-width: 801px) {
|
||||
h2,
|
||||
h1 {
|
||||
font-size: 1rem;
|
||||
font-weight: normal;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
text-transform: uppercase;
|
||||
white-space: pre;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
/* Smartphones */
|
||||
@media (max-width: 800px) {
|
||||
:root {
|
||||
--big_margin: 50px;
|
||||
--med_margin: 25px;
|
||||
--small_margin: 5px;
|
||||
}
|
||||
|
||||
h1 > .decoration:last-of-type:before {
|
||||
content: "";
|
||||
}
|
||||
|
||||
h2 > .decoration:first-of-type:before{
|
||||
content: '______________________________________________________________________\A""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\A* ';
|
||||
}
|
||||
|
||||
h2 > .decoration:last-of-type:before{
|
||||
content: ' *\A______________________________________________________________________\A""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""';
|
||||
}
|
||||
|
||||
h2, h1 {
|
||||
font-size: 1rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h2, h1 {
|
||||
text-transform: uppercase;
|
||||
white-space: pre;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
/* THEME SOMBRE */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
div#container, nav#menu, body {
|
||||
background-color: var(--night-background);
|
||||
}
|
||||
p, pre, ul, li, a, a:hover, h1, h2, footer {
|
||||
color: var(--txt-night);
|
||||
}
|
||||
.highlight {
|
||||
color: var(--night-highlight-color);
|
||||
background-color: var(--night-highlight-bg);
|
||||
}
|
||||
.icone > pre {
|
||||
color: var(--txt-night);
|
||||
}
|
||||
.icone .img_top {
|
||||
background-color: var(--night-background);
|
||||
color: var(--txt-night);
|
||||
}
|
||||
.icone a {
|
||||
color: var(--txt-night);
|
||||
}
|
||||
div#ronce, #coop, #autonomie, #solidarite, #liberte, nav#menu, div#rennes, div#orsay {
|
||||
border-color: var(--txt-night);
|
||||
}
|
||||
section#liste_outils > a > div > p:nth-child(n){
|
||||
color: var(--txt-night);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*GESTION DE LA GRILLE D'UNE PAGE DE TEXTE LEGAL/INFO/BORRING */
|
||||
main {
|
||||
grid-area: core-start / main-col-sep 3 / main-row-fin / main-col-sep 9;
|
||||
}
|
||||
|
||||
/* Tablettes */
|
||||
@media (max-width: 1500px) and (min-width: 801px) {
|
||||
main {
|
||||
grid-area: core-start / main-col-sep 1 / main-row-fin / main-col-sep 11;
|
||||
}
|
||||
}
|
||||
|
||||
/* Smartphones */
|
||||
@media (max-width: 800px) {
|
||||
main {
|
||||
grid-area: core-start / main-col-start / main-row-fin / main-col-sep 12;
|
||||
}
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
<!-- Liste des evenements passés -->
|
||||
<!-- SEPTEMBRE -->
|
||||
<!--<li role="none"><a href="https://freedomnotfear.org/">Freedom not Fear</a> au Mundo B (Bruxelles), <span class="highlight">du 2 au 5 septembre.</span><br>Conférence pour défendre les libertés fondamentales dans le numérique : échanges sur le cadre légal au niveau européen, rencontre avec des députés.</li>
|
||||
<li role="none"><a href="https://www.laquadrature.net/agenda/">Quadr'apéro</a> à La Quadrature du Net (Paris), <span class="highlight">le 15 septembre à 19h.</span><br>Rencontre mensuelle avec la Quadrature, échange sur les libertés fondamentales et point sur les actions de LQDN.</li>
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/25967">Cafés du libre</a> au Café Citoyen (Lille), <span class="highlight">le 27 septembre à 20h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée par Chtinux le dernier mardi de chaque mois. Vous pourrez y rencontrer Adrien.</li>
|
||||
-->
|
||||
<!-- OCTOBRE -->
|
||||
<!--<li role="none"><a href="https://agiralyon.fr/">Festival Agir à Lyon</a> à la Maison pour tous des Rancy (Lyon), <span class="highlight">le 9 octobre.</span><br>Festival organisé par Anciela pour agir pour la transition écologique et solidaire. Quentin présentera notre vision de la sobriété numérique avec Commown et Telecoop.</li>
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/26101">Permanence associative autour du libre</a> au Café Citoyen (Lille), <span class="highlight">le 25 octobre à 20h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée par <a href="https://raoull.org/">Raoull</a> et Deuxfleurs le dernier mardi de chaque mois. Vous pourrez y rencontrer Adrien.</li>
|
||||
<li role="none"><a href="https://pad.deuxfleurs.fr/form/#/2/form/view/mAscGaMNHcBlHs1H30bP-tqOsGrP-kLkGvFipK+EuvE/embed/">Permanence Deuxfleurs</a> à Bricologis, Vaulx en Velin (proche Lyon), <span class="highlight">le 29 octobre de 14h à 16h.</span><br>Deuxfleurs organise sa première permanence avec Bricologis pour vous aider à transitionner vers un Internet éthique ! L'inscription est requise en cliquant sur le lien ci-dessus.</li>
|
||||
-->
|
||||
<!-- NOVEMBRE -->
|
||||
<!--
|
||||
<li role="none"><a href="https://capitoledulibre.org/">Capitole du Libre</a> à l'ENSEEIHT (Toulouse), <span class="highlight">le 19 et 20 novembre.</span><br>Conférence annuelle dédiée au logiciel libre, ouverte à tout public et ceci gratuitement. Vincent y présentera le logiciel Garage et ses impacts sur l'hébergement de services.</li>
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/26185">Permanence associative autour du libre</a> au Café Citoyen (Lille), <span class="highlight">le 29 novembre à 20h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée par Raoull et Deuxfleurs le dernier mardi de chaque mois. Vous pourrez y rencontrer Adrien.</li>
|
||||
-->
|
||||
<!-- JANVIER -->
|
||||
<!--<li role="none"><a href="https://flechedor.org/agenda/2023-01-14-technopolice-jo-securitaires-l-etau-se-resserre">Soirée Technopolice</a> à la Flèche d'Or (Paris), <span class="highlight">le 14 janvier à 18h.</span><br>Soirée de présentation, débats, et ateliers dans le cadre de l'initiative Technopolice créée par la Quadrature du Net, particulièrement centrée sur l'organisation des Jeux Olympiques de 2024. Vous pourrez y rencontrer Vincent.</li>
|
||||
<li role="none"><a href="https://formation.emancipasso.net/Programme">Formation Émancip'asso</a> à la Fondation FPH (Paris), <span class="highlight">du 16 au 20 janvier.</span><br>Constatant que les hébergeurs éthiques sont peu nombreux à proposer des solutions prenant en compte les besoins des associations, et notamment l’accompagnement nécessaire pour mener à bien une démarche de transition vers des outils numériques libres, le projet Emancip’Asso souhaite accompagner la montée en compétence des hébergeurs de services alternatifs en leur proposant une formation. La formation est privée mais vous pouvez rencontrer Quentin en soirée ou nous écrire pour partager les besoins numérique de votre association.</li>
|
||||
<li role="none"><a href="https://tmci.fr/wp-content/uploads/2022/12/programme-llpt-21-01-2023.pdf">Logiciel libre pour Tout</a> au Centre Municipal de Loisirs (Tarare), <span class="highlight">le 21 janvier de 10h à 17h.</span><br>TARARE MICRO Club Informatique organise une journée informatique libre, grand public et pour les associations. Au programme : ateliers, conférences, projection de film. Deuxfleurs y proposera des ateliers et vous pourrez rencontrer Quentin.
|
||||
</li>-->
|
||||
<!-- FEVRIER -->
|
||||
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/AG_DF_2023">Assemblée générale ordinaire</a> en ligne, <span class="highlight">le 12 février à 15h.</span><br>Comme chaque année, l'association Deuxfleurs organise son assemblée générale. Divers sujets seront abordés, avec notamment l'élection du nouveau bureau pour un an. Vous pourrez y voir tous les membres ou presque.
|
||||
</li>
|
||||
|
||||
<li role="none"><a href="http://www.salonprimevere.org/">Salon Primevère</a> à Eurexpo (Lyon), <span class="highlight">du 17 au 19 février.</span><br> Organisé par une association et réalisé par 300 bénévoles, le salon Primevère a pour ambition de réunir les acteurs de l’écologie pour présenter des alternatives militantes cohérentes et éthiques à la société actuelle, dans une ambiance conviviale. Vous pourrez y rencontrer Quentin au stand de Hadoly dans l'espace numérique.
|
||||
</li>-->
|
||||
<!-- MARS -->
|
||||
<!--<li role="none"><a href="#">Atelier Brico #1</a> à Bricologis (Vaulx-en-Velin), <span class="highlight">le 18 mars.</span><br> Deuxfleurs organise un atelier à Bricologis à Vaulx-en-Velin pour découvrir le concept de système d'exploitation (OS), pourquoi ça impacte notre rapport à l'informatique, et comprendre ce que les alternatives comme Ubuntu peuvent nous apporter. Inscription possible prochainement.
|
||||
</li>
|
||||
<li role="none"><a href="https://www.lirelasociete.com/evenement-journee-du-livre-politique">32ème journée du livre politique</a> à l'Assemblée Nationale (Paris), <span class="highlight">le 25 mars.</span><br> Journée de tables rondes en présence d'élus ou ex-élus, sur le sujet «Réseaux sociaux : alliés ou ennemis de la démocratie ?». Vous pourrez y trouver Vincent.</li>
|
||||
<li role="none"><a href="http://perso.ens-lyon.fr/laurent.lefevre/greendayslyon2023/">Green Days</a> à l'ENS (Lyon), <span class="highlight">le 27 et 28 mars.</span> (Inscription obligatoire, évènement académique). En 2023, la problématique d'un numérique plus éco-responsable recouvre différentes facettes et de nombreux scientifiques adressent ces sujets dans leurs communautés respectives. Il est temps de se rencontrer et de mettre en commun nos forces de recherche pour amplifier les impacts des travaux et réduire les impacts énergétiques et environnementaux du numérique.
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/26938">Permanence du libre</a> au Café Citoyen (Lille), <span class="highlight">le 28 mars de 20h à 23h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois par les associations Chtinux, Raoull & Deuxfleurs, avec l'amicale participation de Mycélium, CLX et Cliss XXI.</li>-->
|
||||
<!-- Avril -->
|
||||
<!--<li role="none"><a href="https://www.jdll.org/">Journées Du Logiciel Libre</a> à La Maison Pour Tous (Lyon), <span class="highlight">le 1er et 2 avril.</span><br> Deuxfleurs présentera une conférence intitulée "Entre-hébergement : envisagez l'auto-hébergement collectivement !" et sera présente sur l'évènement le week-end, entre autre sur le stand Hadoly. Vous pourriez y rencontrer Esther ou Quentin.</li>
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 4 avril à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne pas trop formalisé pour discuter de ce qui se passe. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://www.bricologis.com/">Atelier Brico #2</a> à Bricologis (Vaulx-en-Velin), <span class="highlight">le 15 avril.</span><br> Deuxfleurs organise un atelier à Bricologis à Vaulx-en-Velin pour découvrir comment démonter un ordinateur, ses composants, et que faire pour le faire durer plus longtemps. Contactez Bricologis directement pour vous inscrire en amont.</li>-->
|
||||
<!-- Mai -->
|
||||
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 2 mai à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://lerize.villeurbanne.fr/agenda/tisser-la-toile-du-web-avec-des-chatons_040523/">Tisser la toile du web avec des CHATONS</a> au Rize (Villeurbane), <span class="highlight">le 4 mai de 18h30 à 20h30</span>.<br> Et si plutôt que de dépendre des quelques silos des géants du numérique nous revenions à un réseau internet décentralisé et résilient ? Si nous imaginions une AMAP du numérique, humaine, locale, libre et éthique ? C’est possible grâce aux CHATONS, un collectif d’hébergeurs propulsé par l’association Framasoft depuis 2016 !</li>
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/27478">Permanence associative autour du Libre</a> à Lille, <span class="highlight">le 31 mai à 20h</span>.<br>
|
||||
La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois par les associations Chtinux, Raoull & Deuxfleurs, avec l'amicale participation de Mycélium, CLX et Cliss XXI. Rejoignez-nous au Café Citoyen !-->
|
||||
<!-- Juin -->
|
||||
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 6 juin à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://programme.passageenseine.fr/">Pas Sage En Seine</a> à la Médiathèque Aragon (Choisy-le-Roi), <span class="highlight">du 15 au 17 juin</span>.<br> Le festival Pas Sage En seine est un rendez-vous annuel de la région parisienne. Lieu incontournable du milieu hacker à ses débuts, il a toujours eu pour vocation d’amener les citoyens de tous horizons à se réapproprier la société en bidouillant le système. Vincent y présentera comment "Surmonter les difficultés de l’auto-hébergement ensemble avec Garage".</li>
|
||||
<li role="none"><a href="https://www.maison-environnement.fr/desconnexions-une-journee-pour-aborder-en-famille-ou-entre-ami-es-les-enjeux-du-numerique-a-la-maison-de-lenvironnement-le-samedi-17-juin/">De(s)connexions</a> à la Maison de l'Environnement (Lyon), <span class="highlight">le 17 juin de 10h à 18h</span>.<br> Une journée pour aborder les enjeux et impacts, positifs et négatifs, du numérique ! Quentin y proposera une animation "technocritique".</li>
|
||||
<li role="none"><a href="#">Barcamp Interne</a> en Auvergne, <span class="highlight">le 24 et 25 juin</span>.<br> Les membres de Deuxfleurs prennent le temps de se retrouver et de discuter de l'association.</li>-->
|
||||
<!-- Septembre -->
|
||||
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 5 septembre à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://www.agendamilitant.org/Affaire-du-8-decembre-antiterrorisme-et-criminalisation-du-chiffrement.html">Soirée affaire du «8 décembre» </a> à la bourse du travail à Paris, <span class="highlight"> le 25 septembre à 19h00</span>.<br>Soirée de discussion autour de la criminalisation du chiffrement à l’œuvre dans l’affaire du «8 décembre», en présence de la Quadrature du Net, N0thing2Hide, le SNJ, et les avocat·es concernés. Vous pourrez y trouver Vincent.</li>
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/28118">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 26 septembre à 20h00</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois par les associations Chtinux, Raoull et Deuxfleurs, avec l'amicale participation de Mycélium, CLX et Cliss XXI. Vous pourrez y croiser Adrien.</li>
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/28178">Quadrapéro</a> au Garage de la Quadrature de Net, <span class="highlight">le 29 septembre à 19h00</span>.<br>Apéritif convivial pour discuter des divers enjeux en cours autour des droits et libertés numériques, en présence de membres de la Quadrature du Net et de bien autres intéressés. Vous y verrez Vincent.</li>
|
||||
<li role="none"><a href="https://venissieux.fr/blog/agenda/le-grand-rendez-vous/">Grand RDV</a> Salle Irène Joliot-Curie à Vénissieux, <span class="highlight">le 30 septembre à 9h00</span>.<br>Nous y tiendrons un stand Deuxfleurs sur le "numérique durable" où nous parlerons d'obsolescence dans le numérique et des solutions qu'on explore. Vous y verrez Quentin et Léa.</li>-->
|
||||
<!-- Octobre -->
|
||||
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 3 octobre à 19h00</span>.<br> Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li> -->
|
||||
<!-- <li role="none"><a href="https://forum.chatons.org/t/assemblee-constituante-du-14-10-23-a-paris-vincennes-objet-gouvernance-moderation-continuite/5163">Assemblée pour les CHATONS</a> à Paris VIII, <span class="highlight">le 14 octobre à 9h</span>.<br> (Réservé en priorité aux CHATONS) Nous serons à Paris pour discuter de l'avenir du collectif le temps d'une journée.</li> -->
|
||||
<!-- <li role="none"><a href="https://www.agendadulibre.org/events/28119">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 31 octobre à 20h00</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li> -->
|
||||
|
||||
<!-- Novembre 2023 -->
|
||||
<!-- <li role="none"><a href="https://www.agendadulibre.org/events/28442">Quadrapéro</a> au Garage de la Quadrature de Net, <span class="highlight">le 3 novembre à 19h00</span>. <br>Apéritif convivial pour discuter des divers enjeux en cours autour des droits et libertés numériques, en présence de membres de la Quadrature du Net et de bien autres intéressés. Vous y verrez Vincent.</li> -->
|
||||
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 7 novembre à 19h00</span>. <br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li> -->
|
||||
<!-- <li role="none"><a href="https://capitoledulibre.org/">Capitole du Libre</a> à l'ENSEEIHT (Toulouse), <span class="highlight">le 18 et 19 novembre</span>. <br>Conférence annuelle dédiée au logiciel libre et à sa communauté, ouverte à tout public, et ceci gratuitement. N'hésitez pas à venir discuter avec Vincent.</li> -->
|
||||
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 22 novembre à 19h00</span>. <br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li> -->
|
||||
<!-- <li role="none"><a href="https://www.agendadulibre.org/events/28120">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 28 novembre à 20h00</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li> -->
|
||||
|
||||
<!-- Décembre 2023 -->
|
||||
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 5 décembre à 19h00</span>. <br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li> -->
|
||||
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 20 décembre à 20h00</span>. <br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li> -->
|
||||
<!-- <li role="none"><a href="https://events.ccc.de/congress/2023/infos/startpage.html">37C3</a> à Hambourg, <span class="highlight">du 27 au 30 décembre</span>. <br>Rendez-vous annuel européen des communautés de l'activisme numérique et des milieux hackers, le Chaos Communication Congress est un rassemblement d'envergure. Vous pourrez y voir Adrien, Boris, Zorun, Vincent et bien d'autres.</li> -->
|
||||
|
||||
|
||||
<!-- Janvier 2024 -->
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 9 janvier 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://www.agendadulibre.org/events/29139">Quadrapéro</a>, au Garage de la Quadrature du Net à Paris, <span class="highlight">le 19 janvier 2024 à 19h00</span>.<br>Apéritif convivial pour discuter des divers enjeux en cours autour des droits et libertés numériques, en présence de membres de la Quadrature du Net et de bien autres intéressés. Vous y verrez Vincent.</li>
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 24 janvier 2024 à 20h00</span>.<br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li>
|
||||
<li role="none"><a href="#">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 25 janvier 2024 à 19h30</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li>
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/ag2024">Assemblée générale ordinaire</a> en ligne, <span class="highlight">le 28 janvier 2024 à 15h00</span>.<br>L'association Deuxfleurs organise sa cinquième assemblée générale. Divers sujets seront abordés, avec notamment l'élection du nouveau bureau pour un an. Vous pourrez y voir tous les membres ou presque.
|
||||
<!-- Février 2024 -->
|
||||
<li role="none"><a href="https://journee-ecoconception-numerique.fr/">Journée de l'écoconception numérique</a> à Paris, <span class="highlight">le 1er février 2024</span>.<br> Pour rassembler la communauté des professionnels du numérique autour de l'écoconception numérique. Quentin y sera.</li>
|
||||
<li role="none"><a href="https://fosdem.org/2024/">FOSDEM</a> à Bruxelles, <span class="highlight">les 3 et 4 février 2024</span>.<br>Pas moins de 7 membres de Deuxfleurs seront sur place, et il y aura 3 présentations de membres de Deuxfleurs : sur <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3009-advances-in-garage-the-low-tech-storage-platform-for-geo-distributed-clusters/">Garage</a>, <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2642--servers-aerogramme-a-multi-region-imap-server/">Aérogramme</a>, et <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3011-a-microkernel-based-orchestrator-for-distributed-internet-services-/">l'orchestration basée sur les microkernels</a>.</li>
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 6 février 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 21 février 2024 à 20h00</span>.<br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li>
|
||||
<li role="none"><a href="#">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 27 février 2024 à 19h30</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li>
|
||||
<!-- Mars 2024 -->
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 5 mars 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://bbb.paquerette.eu/b/dom-67q-irl-nfc">Réunion mensuelle du collectif CHATONS</a> en ligne, <span class="highlight">le 12 mars 2024 à 20h00</span>.<br>Une fois par mois a lieu une réunion entre les membres du collectif <a href=https://www.chatons.org/>CHATONS</a>.</li>
|
||||
<li role="none"><a href="#">Barcamp Interne</a> au Couvent des Clarisses à Roubaix, <span class="highlight">le 15, 16 et 17 mars</span>.<br> Les membres de Deuxfleurs prennent le temps de se retrouver et de discuter de l'association. N'hésitez pas à nous contacter pour passer nous voir le samedi soir.</li>
|
||||
<!-- Avril 2024 -->
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 2 avril 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li role="none"><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 17 avril 2024 à 20h00</span>.<br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li>
|
||||
<li role="none"><a href="#">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 30 avril 2024 à 19h30</span>.<br> La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li>
|
||||
|
||||
|
||||
<!-- Mai 2024 -->
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 7 mai 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 22 mai 2024 à 20h00</span>.<br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li>
|
||||
<li><a href="https://cis.cnrs.fr/netgouv24/">#NetGouv24</a> à Paris, <span class="highlight">le 29 mai 2024</span>.<br>Première conférence annuelle du groupe de travail Gouvernance et Régulation d'Internet. L'ensemble de la communauté scientifique intéressée par ces sujets s'y retrouvera pour une journée de présentations et de discussion.</li>
|
||||
<li><a href="https://passageenseine.fr/">Pas Sage en Seine</a> à Choisy-le-Roi, <span class="highlight">le 31 mai, 1 et 2 juin</span>.<br>Festival annuel gratuit dédié au logiciel libre. De nombreuses présentations sur des sujets techniques ou non y sont faites.</li>
|
||||
<!-- Juin 2024 -->
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 4 juin 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/infra">Réunion d'infrastructure</a> en ligne, <span class="highlight">le 5 juin 2024 à 19h15</span>.<br>Point en visioconférence sur les nouveaux sites géographiques à mettre en place pour pouvoir mieux résister aux pannes.</li>
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 19 juin 2024 à 20h00</span>.<br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li>
|
||||
<li><em>Barcamp Interne</em> en Auvergne, <span class="highlight">les 21, 22 et 23 juin</span>.<br> Les membres de Deuxfleurs prennent le temps de se retrouver et de discuter de l'association.</li>
|
||||
<!-- Juillet 2024 -->
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 2 juillet 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li><a href="https://www.agendadulibre.org/events/30240">Quadrapéro</a>, au Garage de la Quadrature du Net à Paris, <span class="highlight">le 5 juillet 2024 à 19h00</span>.<br>Apéritif convivial pour discuter des divers enjeux en cours autour des droits et libertés numériques, en présence de membres de la Quadrature du Net et de bien autres intéressés. Vous y verrez Vincent.</li>
|
||||
<li><a href="https://bbb.paquerette.eu/b/dom-67q-irl-nfc">Réunion mensuelle du collectif CHATONS</a> en ligne, <span class="highlight">le 9 juillet 2024 à 20h00</span>.<br>Une fois par mois a lieu une réunion entre les membres du collectif <a href=https://www.chatons.org/>CHATONS</a>, à laquelle nous participons.</li>
|
||||
<li><a href="https://libreto.sans-nuage.fr/campchatons2024/">Camp CHATONS</a> à Sévérac, <span class="highlight">du 11 au 15 juillet</span>.<br>Chaque année, les membres du collectif CHATONS se réunissent en présentiel pour aborder les grands sujets à son propos et partager des moments conviviaux. Vous y verrez Adrien.</li>
|
||||
<li><a href="#">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 30 juillet 2024 à 19h30</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li>
|
||||
|
||||
<!-- Août 2024 -->
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle « au coin du feu »</a> en ligne, <span class="highlight">le 6 août 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<!-- Septembre 2024 -->
|
||||
<li><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle « au coin du feu »</a> en ligne, <span class="highlight">le 3 septembre 2024 à 19h00</span>.<br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
|
||||
<li><a href="https://www.agendadulibre.org/events/30486">Numérique libre à la Braderie de Lille</a> au village associatif du Café Citoyen, <span class="highlight">du 14 septembre 2024 à 10h au 15 à 18h</span>.<br>Le spot le plus cool durant la Braderie de Lille, c'est le Café Citoyen (ses spectacles qualitatifs y surpassent de loin les articles vendus trop chers par les brocanteurs que vous trouverez ailleurs). Le spot le plus cool au Café Citoyen, c'est son village associatif. Mais alors la cerise sur le gâteau, c'est sans doute le stand sur les libertés numériques tenu par les collectifs de Chtinux (Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI...). Venez dire bonjour, vous serez bien reçu⋅e !</li>
|
||||
<li><a href="https://fete.humanite.fr/">Fête de l'Humanité</a> à la base 217 à Bretigny-sur-Orge, <span class="highlight">le 14 et 15 septembre 2024</span>.<br>Plus qu'un festival de musique, la fête de l'Humanité est un rendez-vous important des forces militantes sur un peu tous les sujets. Si vous souhaitez y rencontrer Vincent, n'hésitez pas à nous contacter par courriel auparavant pour que l'on s'organise et que l'on ne se rate pas.</li>
|
||||
<li><a href="https://www.agendadulibre.org/events/30485">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 24 septembre 2024 à 19h30</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs de Chtinux (Raoull, Deuxfleurs, Mycélium, CLX, Cliss XXI...).</li>
|
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 230 KiB |
Before Width: | Height: | Size: 247 KiB |
Before Width: | Height: | Size: 15 KiB |
1395
static/index.html
|
@ -1,13 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Redirection automatique en HTML</title>
|
||||
<meta http-equiv="refresh" content="0; URL=https://guide.deuxfleurs.fr/formations/rdv-2023/">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<p>Cette page est une redirection vers : <a href="https://guide.deuxfleurs.fr/formations/rdv-2023/">Vénissieux Grand RDV 2023</a></p>
|
||||
</body>
|
||||
|
||||
</html>
|
Before Width: | Height: | Size: 416 KiB |
|
@ -1,47 +0,0 @@
|
|||
// dictionary to keep track of frame count for each animation
|
||||
let frameCounts = {};
|
||||
|
||||
function animate(id, delay) {
|
||||
|
||||
// get the container and frames for the amination
|
||||
const container = document.getElementById(id);
|
||||
const frames = container.children;
|
||||
|
||||
// set up the frame counter
|
||||
frameCounts[id] = 0;
|
||||
|
||||
// hide all frames except for the first
|
||||
frames[0].style.display = "flex";
|
||||
for (let i = 1; i < frames.length; i++) {
|
||||
frames[i].style.display = "none";
|
||||
}
|
||||
|
||||
// start the animation
|
||||
const interval = setInterval(updateAnimation, delay, id, frames, frames.length);
|
||||
|
||||
}
|
||||
|
||||
function updateAnimation(id, frames, totalFrames) {
|
||||
|
||||
// increment the frame counter for the given id
|
||||
frameCounts[id] = (frameCounts[id] + 1) % totalFrames;
|
||||
|
||||
// show the next frame
|
||||
frames[frameCounts[id]].style.display = "flex";
|
||||
|
||||
// hide the previous frame
|
||||
if (frameCounts[id] == 0) {
|
||||
frames[totalFrames - 1].style.display = "none";
|
||||
} else {
|
||||
frames[frameCounts[id] - 1].style.display = "none";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If the user have a setting on their device to minimize the amount of non-essential motion
|
||||
const preferReduceMotion = window.matchMedia("(prefers-reduced-motion)").matches;
|
||||
|
||||
animate("illustration-accueil", preferReduceMotion ? 1500 : 500); // Reduce framerate if use preference is to reduce motion
|
||||
animate("rennes", preferReduceMotion ? 3000 : 1000); // Reduce framerate if use preference is to reduce motion
|
||||
animate("orsay", preferReduceMotion ? 4000 : 2000); // Reduce framerate if use preference is to reduce motion
|
||||
animate("parterre", 1500);
|