From d063d599a2c50b08e0a221be122d04d909a8d241 Mon Sep 17 00:00:00 2001 From: Jonas Aorus Date: Thu, 18 Apr 2024 11:42:20 +0200 Subject: [PATCH] Deploy website - based on bc5e5bf6a414a788c204cd99bb10c9b1a32cbde0 --- 404.html | 2 +- assets/js/{3f20655a.db2c556f.js => 3f20655a.9f0b06c2.js} | 2 +- ...{runtime~main.27ce0fdf.js => runtime~main.03140ab8.js} | 2 +- cgucgv/index.html | 2 +- docs/Tips/facebook/index.html | 2 +- .../Billetterie/admin_add_new_event/index.html | 2 +- .../Billetterie/admin_add_new_free_event/index.html | 2 +- docs/Utilisateur/Billetterie/iframe/index.html | 2 +- docs/Utilisateur/Billetterie/rss/index.html | 2 +- docs/Utilisateur/Billetterie/webhook/index.html | 2 +- docs/Utilisateur/Cashless/admin_add_article/index.html | 2 +- docs/Utilisateur/Cashless/admin_add_categorie/index.html | 2 +- docs/Utilisateur/Cashless/admin_add_pos/index.html | 2 +- docs/Utilisateur/Cashless/admin_add_primary/index.html | 2 +- docs/Utilisateur/Cashless/admin_supp/index.html | 2 +- docs/Utilisateur/Cashless/android/index.html | 2 +- docs/Utilisateur/Cashless/badge/index.html | 2 +- docs/Utilisateur/Cashless/cashback/index.html | 2 +- docs/Utilisateur/Cashless/fidelity/index.html | 2 +- .../Cashless/impression_preparation/index.html | 2 +- docs/api/apikey/index.html | 2 +- docs/api/events/index.html | 2 +- docs/api/intro/index.html | 2 +- docs/api/products/index.html | 2 +- docs/api/reservations/index.html | 2 +- docs/api/tenants/index.html | 2 +- docs/category/api/index.html | 2 +- docs/category/billetterie/index.html | 2 +- docs/category/cashless/index.html | 2 +- docs/category/diy/index.html | 2 +- docs/category/documentation-utilisateur/index.html | 2 +- "docs/category/pr\303\251sentation/index.html" | 2 +- docs/category/trucs-et-astuces/index.html | 2 +- docs/install/docker_install/index.html | 8 ++++---- docs/install/raspberry/index.html | 2 +- docs/install/raspberry_soft/index.html | 2 +- docs/presentation/demonstration/index.html | 2 +- docs/presentation/introduction/index.html | 2 +- docs/presentation/logos/index.html | 2 +- docs/presentation/philosophie/index.html | 2 +- docs/presentation/tarifs/index.html | 2 +- docs/presentation/usages/index.html | 2 +- docs/tags/access-card/index.html | 2 +- docs/tags/associations/index.html | 2 +- docs/tags/badge-inter-lieux/index.html | 2 +- docs/tags/billetterie/index.html | 2 +- docs/tags/caisse-enregistreuse/index.html | 2 +- docs/tags/card/index.html | 2 +- docs/tags/cash-register/index.html | 2 +- docs/tags/cashback/index.html | 2 +- docs/tags/cashless/index.html | 2 +- docs/tags/catering/index.html | 2 +- docs/tags/cooperative/index.html | 2 +- docs/tags/dematerialized-payment/index.html | 2 +- docs/tags/demonstration/index.html | 2 +- docs/tags/dokos/index.html | 2 +- docs/tags/events/index.html | 2 +- docs/tags/federated/index.html | 2 +- docs/tags/festival/index.html | 2 +- docs/tags/fidelite/index.html | 2 +- docs/tags/fidelity/index.html | 2 +- docs/tags/free-software/index.html | 2 +- docs/tags/index.html | 2 +- docs/tags/local-currencies/index.html | 2 +- docs/tags/logiciel-libre/index.html | 2 +- docs/tags/loyalty/index.html | 2 +- docs/tags/monnaie-locale/index.html | 2 +- docs/tags/monnaies-locales/index.html | 2 +- docs/tags/monnaies-temps/index.html | 2 +- docs/tags/open-source/index.html | 2 +- docs/tags/order-taking/index.html | 2 +- docs/tags/paiement-dematerialise/index.html | 2 +- docs/tags/prise-de-commandes/index.html | 2 +- docs/tags/stripe/index.html | 2 +- docs/tags/ticketing/index.html | 2 +- docs/tags/tiers-lieux/index.html | 2 +- docs/tags/time-currencies/index.html | 2 +- docs/tags/venue/index.html | 2 +- fr/404.html | 2 +- .../js/{a4a43940.019bd91f.js => a4a43940.1eec1011.js} | 2 +- ...{runtime~main.e1f3c192.js => runtime~main.714a8c2b.js} | 2 +- fr/cgucgv/index.html | 2 +- fr/docs/Tips/facebook/index.html | 2 +- .../Billetterie/admin_add_new_event/index.html | 2 +- .../Billetterie/admin_add_new_free_event/index.html | 2 +- fr/docs/Utilisateur/Billetterie/iframe/index.html | 2 +- fr/docs/Utilisateur/Billetterie/rss/index.html | 2 +- fr/docs/Utilisateur/Billetterie/webhook/index.html | 2 +- fr/docs/Utilisateur/Cashless/admin_add_article/index.html | 2 +- .../Utilisateur/Cashless/admin_add_categorie/index.html | 2 +- fr/docs/Utilisateur/Cashless/admin_add_pos/index.html | 2 +- fr/docs/Utilisateur/Cashless/admin_add_primary/index.html | 2 +- fr/docs/Utilisateur/Cashless/admin_supp/index.html | 2 +- fr/docs/Utilisateur/Cashless/android/index.html | 2 +- fr/docs/Utilisateur/Cashless/badge/index.html | 2 +- fr/docs/Utilisateur/Cashless/cashback/index.html | 2 +- fr/docs/Utilisateur/Cashless/fedelity/index.html | 2 +- .../Cashless/impression_preparation/index.html | 2 +- fr/docs/api/apikey/index.html | 2 +- fr/docs/api/events/index.html | 2 +- fr/docs/api/intro/index.html | 2 +- fr/docs/api/products/index.html | 2 +- fr/docs/api/reservations/index.html | 2 +- fr/docs/api/tenants/index.html | 2 +- fr/docs/category/api/index.html | 2 +- fr/docs/category/billetterie/index.html | 2 +- fr/docs/category/cashless/index.html | 2 +- fr/docs/category/diy/index.html | 2 +- fr/docs/category/documentation-utilisateur/index.html | 2 +- "fr/docs/category/pr\303\251sentation/index.html" | 2 +- fr/docs/category/trucs-et-astuces/index.html | 2 +- fr/docs/install/docker_install/index.html | 8 ++++---- fr/docs/install/raspberry/index.html | 2 +- fr/docs/install/raspberry_soft/index.html | 2 +- fr/docs/presentation/demonstration/index.html | 2 +- fr/docs/presentation/introduction/index.html | 2 +- fr/docs/presentation/logos/index.html | 2 +- fr/docs/presentation/philosophie/index.html | 2 +- fr/docs/presentation/tarifs/index.html | 2 +- fr/docs/presentation/usages/index.html | 2 +- fr/docs/tags/access-card/index.html | 2 +- fr/docs/tags/badge-inter-lieux/index.html | 2 +- fr/docs/tags/badge/index.html | 2 +- fr/docs/tags/badgeuse/index.html | 2 +- fr/docs/tags/billetterie/index.html | 2 +- fr/docs/tags/caisse-enregistreuse/index.html | 2 +- fr/docs/tags/cashback/index.html | 2 +- fr/docs/tags/cashless/index.html | 2 +- fr/docs/tags/cooperative/index.html | 2 +- fr/docs/tags/demonstration/index.html | 2 +- fr/docs/tags/dokos/index.html | 2 +- fr/docs/tags/festival/index.html | 2 +- fr/docs/tags/fidelite/index.html | 2 +- fr/docs/tags/fidelity/index.html | 2 +- fr/docs/tags/index.html | 2 +- fr/docs/tags/logiciel-libre/index.html | 2 +- fr/docs/tags/monnaie-locale/index.html | 2 +- fr/docs/tags/monnaies-locales/index.html | 2 +- fr/docs/tags/monnaies-temps/index.html | 2 +- fr/docs/tags/open-source/index.html | 2 +- fr/docs/tags/paiement-dematerialise/index.html | 2 +- fr/docs/tags/prise-de-commandes/index.html | 2 +- fr/docs/tags/stripe/index.html | 2 +- fr/docs/tags/ticketing/index.html | 2 +- fr/docs/tags/tiers-lieux/index.html | 2 +- fr/index.html | 2 +- fr/roadmap/index.html | 2 +- index.html | 2 +- roadmap/index.html | 2 +- 149 files changed, 155 insertions(+), 155 deletions(-) rename assets/js/{3f20655a.db2c556f.js => 3f20655a.9f0b06c2.js} (81%) rename assets/js/{runtime~main.27ce0fdf.js => runtime~main.03140ab8.js} (99%) rename fr/assets/js/{a4a43940.019bd91f.js => a4a43940.1eec1011.js} (80%) rename fr/assets/js/{runtime~main.e1f3c192.js => runtime~main.714a8c2b.js} (99%) diff --git a/404.html b/404.html index d8913332..eed78b25 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Page Not Found | TiBillet - + diff --git a/assets/js/3f20655a.db2c556f.js b/assets/js/3f20655a.9f0b06c2.js similarity index 81% rename from assets/js/3f20655a.db2c556f.js rename to assets/js/3f20655a.9f0b06c2.js index 8f031509..da42c5b1 100644 --- a/assets/js/3f20655a.db2c556f.js +++ b/assets/js/3f20655a.9f0b06c2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[8703],{3967:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>d});var r=s(4848),o=s(8453);const t={sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},i=void 0,a={id:"install/server_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",source:"@site/docs/install/server_install.md",sourceDirName:"install",slug:"/install/docker_install",permalink:"/docs/install/docker_install",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/install/server_install.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},sidebar:"tutorialSidebar",previous:{title:"Raspberry Box - Software",permalink:"/docs/install/raspberry_soft"},next:{title:"API",permalink:"/docs/category/api"}},l={},d=[{value:"Legal warning",id:"legal-warning",level:2},{value:"Introduction to Engines",id:"introduction-to-engines",level:2},{value:"Generate many Fernet key and django secret key",id:"generate-many-fernet-key-and-django-secret-key",level:3},{value:"Fedow : One ring to rule them all",id:"fedow--one-ring-to-rule-them-all",level:2},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable",level:3},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch",level:3},{value:"Nginx rules",id:"nginx-rules",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file",level:3},{value:"Launch the rocket !",id:"launch-the-rocket-",level:3},{value:"Backup",id:"backup",level:3},{value:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill.",id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",level:2},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch-1",level:3},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable-1",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file-1",level:3},{value:"Nginx rules",id:"nginx-rules-1",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"legal-warning",children:"Legal warning"}),"\n",(0,r.jsxs)(n.admonition,{type:"danger",children:[(0,r.jsxs)(n.p,{children:["Since January 1, 2018, in order to combat VAT fraud, all VAT-registered professionals recording\ncustomer payments using one of these software or systems are required to use secure, ",(0,r.jsx)(n.strong,{children:"certified hardware"}),"."]}),(0,r.jsxs)(n.p,{children:["A measure enshrined in\n",(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"Article 286 3\xb0 bis of the General Tax Code"}),"\nand initially stemming from the 2016 Finance Act,\nwhen ",(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"April"}),"\nbecame involved in promoting and defending open-source\nsoftware with cashiering functions."]}),(0,r.jsxs)(n.p,{children:["If you're using ",(0,r.jsx)(n.a,{href:"/docs/presentation/tarifs",children:"TiBillet's Coop' and SaaS model"}),", you don't need to worry about any of\nthis : We provide you with the certificate."]}),(0,r.jsx)(n.p,{children:"But if you self-host your own cash register instance, you legally become the publisher, and we can't provide you with\nany legal documents to present to the tax authorities."}),(0,r.jsx)(n.p,{children:"I imagine that if you're here, it's to install it yourself ;)"}),(0,r.jsx)(n.p,{children:"Here you are informed!"})]}),"\n",(0,r.jsx)(n.p,{children:"More information here (in french) :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse",children:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"introduction-to-engines",children:"Introduction to Engines"}),"\n",(0,r.jsx)(n.p,{children:"Tibillet is a software suite composed of several interoperable building blocks. The engines are :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Fedow",children:"Fedow"}),": Federated and open wallet, the federation engine. A PoA and Rsa key based\nblockchain to\nshare membership assets, local currencies and\ntime for several Lespass and LaBoutik instances."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Lespass",children:"Lespass"}),": Ticketing, booking, membership and landing page engines. Usefull too\nfor refill online with self scanned qrcode unique on each card."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/LaBoutik",children:"LaBoutik"}),": Cash register, cashless system with RFID / NFC chip and order-taking\nsystem."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"To get the full functionality of TiBillet, you need to install these three engines."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Fedow"})," for multiple locations (RSA based PoA blockchain)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Lespass"})," for multiple locations (Django multi-tenant)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Laboutik"})," per location, which connects to a fedow and a lespass to join a federation."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{title:"Exemple",type:"note",children:(0,r.jsxs)(n.p,{children:["if you want to use the same NFC card to manage cashless at 2 festivals and 3 community caf\xe9s, you'll need 5\n",(0,r.jsx)(n.strong,{children:"LabouTik"}),", but only one ",(0,r.jsx)(n.strong,{children:"Fedow"})," for the federated asset, and one ",(0,r.jsx)(n.strong,{children:"Lespass"})," for the webpage of each venue.\nThe same applies if you want to manage a co-working subscription for a\ngroup of ",(0,r.jsx)(n.em,{children:"third place"})," in a given city/region/department."]})}),"\n",(0,r.jsx)(n.h1,{id:"requirements-",children:"Requirements :"}),"\n",(0,r.jsxs)(n.p,{children:["For security and performance reasons, we recommend that you separate the ",(0,r.jsx)(n.strong,{children:"Lespass"})," public area from the ",(0,r.jsx)(n.strong,{children:"LaBoutik"}),"\ncheckout and ",(0,r.jsx)(n.strong,{children:"Fedow"})," federation engines."]}),"\n",(0,r.jsx)(n.p,{children:"For dev' and test purpose, you can install everything on one VPS. Here the minimal requirements :"}),"\n",(0,r.jsx)(n.p,{children:"A linux server with :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"2 vCpu / 4Go Ram"}),"\n",(0,r.jsx)(n.li,{children:"Docker & Compose"}),"\n",(0,r.jsx)(n.li,{children:"1 domain with wildcard capacity"}),"\n",(0,r.jsx)(n.li,{children:"A Reverse proxy who handle 443 and 80 port (we use Traefik)"}),"\n",(0,r.jsxs)(n.li,{children:["A valid Stripe account with ",(0,r.jsx)(n.em,{children:"Stripe connect"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can find some ressource (in french) here :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If you're ready for adventure, create a new folder \"TiBillet\", and let's start by installing a Fedow!"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet && cd TiBillet\n"})}),"\n",(0,r.jsx)(n.h3,{id:"generate-many-fernet-key-and-django-secret-key",children:"Generate many Fernet key and django secret key"}),"\n",(0,r.jsx)(n.p,{children:"You will need 3 couple of Fernet/Django secret key."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Generate fernet key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from cryptography.fernet import Fernet; print('\\n'.join([Fernet.generate_key().decode('utf-8') for i in range(0,30)]))\"\n\n# Generate django secret key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from django.core.management.utils import get_random_secret_key; print('\\n'.join([get_random_secret_key() for i in range(0,30)]))\"\n"})}),"\n",(0,r.jsx)(n.h2,{id:"fedow--one-ring-to-rule-them-all",children:"Fedow : One ring to rule them all"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Fedow && cd TiBillet/Fedow\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create .env and fill with :\nSECRET_KEY='' # see upper to create one\nFERNET_KEY='' # see upper to create one\nDOMAIN='' # ex : fedow.domain.com\nSTRIPE_KEY='' # from your stripe account\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create frontend and backend network with docker\ndocker network create frontend\ndocker network create fedow_backend\n\n# prepare the logs, assets, database and nginx conf folder\nmkdir logs www database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/django.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"server {\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://fedow_django:8000;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header Host $host;\n proxy_redirect off;\n }\n}\n"})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"services:\n fedow_memcached:\n image: memcached:1.6\n container_name: fedow_memcached\n hostname: fedow_memcached\n restart: always\n networks:\n - fedow_backend\n \n fedow_django:\n image: tibillet/fedow:latest\n container_name: fedow_django\n hostname: fedow_django\n restart: always\n env_file: .env\n user: fedow\n volumes:\n - ./database:/home/fedow/Fedow/database\n - ./www:/home/fedow/Fedow/www\n - ./logs:/home/fedow/Fedow/logs\n links:\n - fedow_memcached:memcached\n networks:\n - fedow_backend\n\n fedow_nginx:\n image: nginx:latest\n restart: always\n container_name: fedow_nginx\n hostname: fedow_nginx\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n depends_on:\n - fedow_django\n links:\n - fedow_django:fedow_django\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.fedow_nginx.tls.certresolver=myresolver\n - traefik.http.routers.fedow_nginx.rule=Host(`$DOMAIN`)\n - traefik.http.services.fedow_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - fedow_backend\n\n\nnetworks:\n frontend:\n external: true\n fedow_backend:\n"})}),"\n",(0,r.jsx)(n.h3,{id:"launch-the-rocket-",children:"Launch the rocket !"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d \n# To see the logs :\ndocker compose logs -f \n"})}),"\n",(0,r.jsxs)(n.p,{children:["And check to ",(0,r.jsx)(n.code,{children:"https:///dashboard"})]}),"\n",(0,r.jsx)(n.p,{children:"Congratulation, You own your blockchain ;)"}),"\n",(0,r.jsx)(n.h3,{id:"backup",children:"Backup"}),"\n",(0,r.jsx)(n.p,{children:"To make a backup, simply back up the database folder regularly."}),"\n",(0,r.jsx)(n.h2,{id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",children:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill."}),"\n",(0,r.jsxs)(n.p,{children:["Lespass is a multi-tenant engine. It is designed to work with a traefik and a wildcard certificate. See\nthe ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/",children:"Code Commun blog"})," for\nexemple : ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})]}),"\n",(0,r.jsx)(n.p,{children:"For a test and development environment, it can be run on the same environment as Fedow :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Lespass && cd TiBillet/Lespass\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch-1",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# prepare the logs, assets, backup and database folder\nmkdir logs www backup database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable-1",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Secret\nDJANGO_SECRET='' # see upper to create one\nFERNET_KEY='' # see upper to create one\n\nSTRIPE_KEY='' # from your stripe account\n# or \nSTRIPE_KEY_TEST=''\nSTRIPE_TEST=0 # set to 1 for use stripe test env\n\n# Database\nPOSTGRES_HOST='lespass_postgres'\nPOSTGRES_USER='lespass_postgres_user'\nPOSTGRES_PASSWORD='' # strong ! generate a new fernet for exemple.\nPOSTGRES_DB='lespass'\n\nTIME_ZONE='Europe/Paris' # or where you are\nPUBLIC='TiBillet Coop.' # The name of the root instance\n\nFEDOW_DOMAIN='' # the same as Fedow\n\nDOMAIN='' # for the wildcard : without subdomain ! ex : tibillet.coop, not lespass.tibillet.coop\nSUB='' # the sub domain of your first place ex : if 'festival', it will be accessible on https://festival.tibillet.coop\nMETA='' # the federated agenda for all events on all tenants. If 'agenda', it will be accessible, for exemple, on https://agenda.tibillet.coop\n\n# For transactionnal email : \nEMAIL_HOST=''\nEMAIL_PORT=''\nEMAIL_HOST_USER=''\nEMAIL_HOST_PASSWORD=''\n\n# Change only if needed :\nCELERY_BROKER='redis://redis:6379/0'\nCELERY_BACKEND='redis://redis:6379/0'\n"})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file-1",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'services:\n lespass_postgres:\n image: postgres:13-bookworm\n restart: unless-stopped\n container_name: lespass_postgres\n hostname: lespass_postgres\n volumes:\n - ./database/data:/var/lib/postgresql/data\n env_file: .env\n networks:\n - lespass_backend\n\n lespas_memcached:\n image : memcached:1.6\n container_name: lespas_memcached\n hostname: lespas_memcached\n restart: always\n networks:\n - lespass_backend\n\n lespas_redis:\n container_name: lespas_redis\n hostname: lespas_redis\n image: redis:7.2.3-bookworm\n restart: unless-stopped\n networks:\n - lespass_backend\n\n lespass_django:\n image: tibillet/lespass:latest\n restart: unless-stopped\n container_name: lespass_django\n hostname: lespass_django\n volumes:\n - ./www:/DjangoFiles/www\n - ./logs:/DjangoFiles/logs\n - ./backup:/Backup\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n\n lespass_celery:\n image: tibillet/lespass:latest\n container_name: lespass_celery\n hostname: lespass_celery\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n command: "poetry run celery -A TiBillet worker -l INFO"\n\n\n lespass_nginx:\n image: nginx:latest\n container_name: lespass_nginx\n hostname: lespass_nginx\n links:\n - lespass_django:lespass_django\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.lespass_nginx.tls.certresolver=myresolver\n - traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)\n - traefik.http.services.lespass_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - lespass_backend\n\n\n\nnetworks:\n frontend:\n external: true\n lespass_backend:\n\n'})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules-1",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/lespass.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'server {\n\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://lespass_django:8002;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_redirect off;\n proxy_http_version 1.1;\n client_max_body_size 4M;\n proxy_buffer_size 16k;\n proxy_buffers 32 16k;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection "upgrade";\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-Host $server_name;\n }\n}\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var r=s(6540);const o={},t=r.createContext(o);function i(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[8703],{3967:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>d});var r=s(4848),o=s(8453);const t={sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},i=void 0,a={id:"install/server_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",source:"@site/docs/install/server_install.md",sourceDirName:"install",slug:"/install/docker_install",permalink:"/docs/install/docker_install",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/install/server_install.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},sidebar:"tutorialSidebar",previous:{title:"Raspberry Box - Software",permalink:"/docs/install/raspberry_soft"},next:{title:"API",permalink:"/docs/category/api"}},l={},d=[{value:"Legal warning",id:"legal-warning",level:2},{value:"Introduction to Engines",id:"introduction-to-engines",level:2},{value:"Generate many Fernet key and django secret key",id:"generate-many-fernet-key-and-django-secret-key",level:3},{value:"Fedow : One ring to rule them all",id:"fedow--one-ring-to-rule-them-all",level:2},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable",level:3},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch",level:3},{value:"Nginx rules",id:"nginx-rules",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file",level:3},{value:"Launch the rocket !",id:"launch-the-rocket-",level:3},{value:"Backup",id:"backup",level:3},{value:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill.",id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",level:2},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch-1",level:3},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable-1",level:3},{value:"Nginx rules",id:"nginx-rules-1",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file-1",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"legal-warning",children:"Legal warning"}),"\n",(0,r.jsxs)(n.admonition,{type:"danger",children:[(0,r.jsxs)(n.p,{children:["Since January 1, 2018, in order to combat VAT fraud, all VAT-registered professionals recording\ncustomer payments using one of these software or systems are required to use secure, ",(0,r.jsx)(n.strong,{children:"certified hardware"}),"."]}),(0,r.jsxs)(n.p,{children:["A measure enshrined in\n",(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"Article 286 3\xb0 bis of the General Tax Code"}),"\nand initially stemming from the 2016 Finance Act,\nwhen ",(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"April"}),"\nbecame involved in promoting and defending open-source\nsoftware with cashiering functions."]}),(0,r.jsxs)(n.p,{children:["If you're using ",(0,r.jsx)(n.a,{href:"/docs/presentation/tarifs",children:"TiBillet's Coop' and SaaS model"}),", you don't need to worry about any of\nthis : We provide you with the certificate."]}),(0,r.jsx)(n.p,{children:"But if you self-host your own cash register instance, you legally become the publisher, and we can't provide you with\nany legal documents to present to the tax authorities."}),(0,r.jsx)(n.p,{children:"I imagine that if you're here, it's to install it yourself ;)"}),(0,r.jsx)(n.p,{children:"Here you are informed!"})]}),"\n",(0,r.jsx)(n.p,{children:"More information here (in french) :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse",children:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"introduction-to-engines",children:"Introduction to Engines"}),"\n",(0,r.jsx)(n.p,{children:"Tibillet is a software suite composed of several interoperable building blocks. The engines are :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Fedow",children:"Fedow"}),": Federated and open wallet, the federation engine. A PoA and Rsa key based\nblockchain to\nshare membership assets, local currencies and\ntime for several Lespass and LaBoutik instances."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Lespass",children:"Lespass"}),": Ticketing, booking, membership and landing page engines. Usefull too\nfor refill online with self scanned qrcode unique on each card."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/LaBoutik",children:"LaBoutik"}),": Cash register, cashless system with RFID / NFC chip and order-taking\nsystem."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"To get the full functionality of TiBillet, you need to install these three engines."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Fedow"})," for multiple locations (RSA based PoA blockchain)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Lespass"})," for multiple locations (Django multi-tenant)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Laboutik"})," per location, which connects to a fedow and a lespass to join a federation."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{title:"Exemple",type:"note",children:(0,r.jsxs)(n.p,{children:["if you want to use the same NFC card to manage cashless at 2 festivals and 3 community caf\xe9s, you'll need 5\n",(0,r.jsx)(n.strong,{children:"LabouTik"}),", but only one ",(0,r.jsx)(n.strong,{children:"Fedow"})," for the federated asset, and one ",(0,r.jsx)(n.strong,{children:"Lespass"})," for the webpage of each venue.\nThe same applies if you want to manage a co-working subscription for a\ngroup of ",(0,r.jsx)(n.em,{children:"third place"})," in a given city/region/department."]})}),"\n",(0,r.jsx)(n.h1,{id:"requirements-",children:"Requirements :"}),"\n",(0,r.jsxs)(n.p,{children:["For security and performance reasons, we recommend that you separate the ",(0,r.jsx)(n.strong,{children:"Lespass"})," public area from the ",(0,r.jsx)(n.strong,{children:"LaBoutik"}),"\ncheckout and ",(0,r.jsx)(n.strong,{children:"Fedow"})," federation engines."]}),"\n",(0,r.jsx)(n.p,{children:"For dev' and test purpose, you can install everything on one VPS. Here the minimal requirements :"}),"\n",(0,r.jsx)(n.p,{children:"A linux server with :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"2 vCpu / 4Go Ram"}),"\n",(0,r.jsx)(n.li,{children:"Docker & Compose"}),"\n",(0,r.jsx)(n.li,{children:"1 domain with wildcard capacity"}),"\n",(0,r.jsx)(n.li,{children:"A Reverse proxy who handle 443 and 80 port (we use Traefik)"}),"\n",(0,r.jsxs)(n.li,{children:["A valid Stripe account with ",(0,r.jsx)(n.em,{children:"Stripe connect"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can find some ressource (in french) here :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If you're ready for adventure, create a new folder \"TiBillet\", and let's start by installing a Fedow!"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet && cd TiBillet\n"})}),"\n",(0,r.jsx)(n.h3,{id:"generate-many-fernet-key-and-django-secret-key",children:"Generate many Fernet key and django secret key"}),"\n",(0,r.jsx)(n.p,{children:"You will need 3 couple of Fernet/Django secret key."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Generate fernet key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from cryptography.fernet import Fernet; print('\\n'.join([Fernet.generate_key().decode('utf-8') for i in range(0,30)]))\"\n\n# Generate django secret key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from django.core.management.utils import get_random_secret_key; print('\\n'.join([get_random_secret_key() for i in range(0,30)]))\"\n"})}),"\n",(0,r.jsx)(n.h2,{id:"fedow--one-ring-to-rule-them-all",children:"Fedow : One ring to rule them all"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Fedow && cd TiBillet/Fedow\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create .env and fill with :\nSECRET_KEY='' # see upper to create one\nFERNET_KEY='' # see upper to create one\nDOMAIN='' # ex : fedow.domain.com\nSTRIPE_KEY='' # from your stripe account\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create frontend and backend network with docker\ndocker network create frontend\ndocker network create fedow_backend\n\n# prepare the logs, assets, database and nginx conf folder\nmkdir logs www database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/django.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"server {\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://fedow_django:8000;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header Host $host;\n proxy_redirect off;\n }\n}\n"})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"services:\n fedow_memcached:\n image: memcached:1.6\n container_name: fedow_memcached\n hostname: fedow_memcached\n restart: always\n networks:\n - fedow_backend\n \n fedow_django:\n image: tibillet/fedow:latest\n container_name: fedow_django\n hostname: fedow_django\n restart: always\n env_file: .env\n user: fedow\n volumes:\n - ./database:/home/fedow/Fedow/database\n - ./www:/home/fedow/Fedow/www\n - ./logs:/home/fedow/Fedow/logs\n links:\n - fedow_memcached:memcached\n networks:\n - fedow_backend\n\n fedow_nginx:\n image: nginx:latest\n restart: always\n container_name: fedow_nginx\n hostname: fedow_nginx\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n depends_on:\n - fedow_django\n links:\n - fedow_django:fedow_django\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.fedow_nginx.tls.certresolver=myresolver\n - traefik.http.routers.fedow_nginx.rule=Host(`$DOMAIN`)\n - traefik.http.services.fedow_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - fedow_backend\n\n\nnetworks:\n frontend:\n external: true\n fedow_backend:\n"})}),"\n",(0,r.jsx)(n.h3,{id:"launch-the-rocket-",children:"Launch the rocket !"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d \n# To see the logs :\ndocker compose logs -f \n"})}),"\n",(0,r.jsxs)(n.p,{children:["And check to ",(0,r.jsx)(n.code,{children:"https:///dashboard"})]}),"\n",(0,r.jsx)(n.p,{children:"Congratulation, You own your blockchain ;)"}),"\n",(0,r.jsx)(n.h3,{id:"backup",children:"Backup"}),"\n",(0,r.jsx)(n.p,{children:"To make a backup, simply back up the database folder regularly."}),"\n",(0,r.jsx)(n.h2,{id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",children:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill."}),"\n",(0,r.jsxs)(n.p,{children:["Lespass is a multi-tenant engine. It is designed to work with a traefik and a wildcard certificate. See\nthe ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/",children:"Code Commun blog"})," for\nexemple : ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})]}),"\n",(0,r.jsx)(n.p,{children:"For a test and development environment, it can be run on the same environment as Fedow :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Lespass && cd TiBillet/Lespass\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch-1",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# prepare the logs, assets, backup and database folder\nmkdir logs www backup database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable-1",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Secret\nDJANGO_SECRET='' # see upper to create one\nFERNET_KEY='' # see upper to create one\n\nSTRIPE_KEY='' # from your stripe account\n# or \nSTRIPE_KEY_TEST=''\nSTRIPE_TEST=0 # set to 1 for use stripe test env\n\n# Database\nPOSTGRES_HOST='lespass_postgres'\nPOSTGRES_USER='lespass_postgres_user'\nPOSTGRES_PASSWORD='' # strong ! generate a new fernet for exemple.\nPOSTGRES_DB='lespass'\n\nTIME_ZONE='Europe/Paris' # or where you are\nPUBLIC='TiBillet Coop.' # The name of the root instance\n\nFEDOW_DOMAIN='' # the same as Fedow\n\nDOMAIN='' # for the wildcard : without subdomain ! ex : tibillet.coop, not lespass.tibillet.coop\nSUB='' # the sub domain of your first place ex : if 'festival', it will be accessible on https://festival.tibillet.coop\nMETA='' # the federated agenda for all events on all tenants. If 'agenda', it will be accessible, for exemple, on https://agenda.tibillet.coop\n\n# For transactionnal email : \nEMAIL_HOST=''\nEMAIL_PORT=''\nEMAIL_HOST_USER=''\nEMAIL_HOST_PASSWORD=''\n\n# Change only if needed :\nCELERY_BROKER='redis://redis:6379/0'\nCELERY_BACKEND='redis://redis:6379/0'\n"})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules-1",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/lespass.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'server {\n\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://lespass_django:8002;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_redirect off;\n proxy_http_version 1.1;\n client_max_body_size 4M;\n proxy_buffer_size 16k;\n proxy_buffers 32 16k;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection "upgrade";\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-Host $server_name;\n }\n}\n\n'})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file-1",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'services:\n lespass_postgres:\n image: postgres:13-bookworm\n restart: unless-stopped\n container_name: lespass_postgres\n hostname: lespass_postgres\n volumes:\n - ./database/data:/var/lib/postgresql/data\n env_file: .env\n networks:\n - lespass_backend\n\n lespas_memcached:\n image : memcached:1.6\n container_name: lespas_memcached\n hostname: lespas_memcached\n restart: always\n networks:\n - lespass_backend\n\n lespas_redis:\n container_name: lespas_redis\n hostname: lespas_redis\n image: redis:7.2.3-bookworm\n restart: unless-stopped\n networks:\n - lespass_backend\n\n lespass_django:\n image: tibillet/lespass:latest\n restart: unless-stopped\n container_name: lespass_django\n hostname: lespass_django\n volumes:\n - ./www:/DjangoFiles/www\n - ./logs:/DjangoFiles/logs\n - ./backup:/Backup\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n\n lespass_celery:\n image: tibillet/lespass:latest\n container_name: lespass_celery\n hostname: lespass_celery\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n command: "poetry run celery -A TiBillet worker -l INFO"\n\n\n lespass_nginx:\n image: nginx:latest\n container_name: lespass_nginx\n hostname: lespass_nginx\n links:\n - lespass_django:lespass_django\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.lespass_nginx.tls.certresolver=myresolver\n - traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)\n - traefik.http.services.lespass_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - lespass_backend\n\n\n\nnetworks:\n frontend:\n external: true\n lespass_backend:\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var r=s(6540);const o={},t=r.createContext(o);function i(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.27ce0fdf.js b/assets/js/runtime~main.03140ab8.js similarity index 99% rename from assets/js/runtime~main.27ce0fdf.js rename to assets/js/runtime~main.03140ab8.js index dc197bb5..38847c68 100644 --- a/assets/js/runtime~main.27ce0fdf.js +++ b/assets/js/runtime~main.03140ab8.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,b,d,f,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var b=t[e]={id:e,loaded:!1,exports:{}};return c[e].call(b.exports,b,b.exports,r),b.loaded=!0,b.exports}r.m=c,r.c=t,e=[],r.O=(a,b,d,f)=>{if(!b){var c=1/0;for(i=0;i=f)&&Object.keys(r.O).every((e=>r.O[e](b[o])))?b.splice(o--,1):(t=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[b,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},b=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var c={};a=a||[null,b({}),b([]),b(b)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=b(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(f,c),f},r.d=(e,a)=>{for(var b in a)r.o(a,b)&&!r.o(e,b)&&Object.defineProperty(e,b,{enumerable:!0,get:a[b]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,b)=>(r.f[b](e,a),a)),[])),r.u=e=>"assets/js/"+({26:"8daeed5c",241:"bbe9a58b",382:"c02dc41d",418:"bcf52ae3",455:"7d04a44f",485:"53a37278",744:"224701f3",853:"2e4a270e",865:"48857ff6",1005:"a78153fe",1051:"b48fe3d4",1369:"dd564d21",1396:"0261f7e4",1622:"53840870",1824:"4b3a11dc",1938:"11632215",2074:"7f42cc60",2240:"b221afeb",2266:"417623db",2365:"731a8187",2388:"fcb2fcfe",2501:"b8322650",2561:"c0ac7b9c",2634:"c4f5d8e4",2708:"88505e11",2938:"a61d05f4",3468:"b1373d58",3737:"a64fcdbf",3952:"7dbf6479",4078:"79300ddd",4107:"96b8ae89",4150:"3151510a",4171:"9812aca5",4268:"991561bb",4279:"df203c0f",4475:"641be602",4506:"ef2138f0",4634:"65f38bd9",4750:"0fc4b3a8",4787:"3720c009",4910:"cc3b42c3",5072:"9a4c38d3",5151:"55960ee5",5179:"c2be3d09",5418:"1623311b",5535:"44bbc5e7",5606:"d26ec100",5621:"3aa14dd0",5747:"bc2e11b2",5864:"78f64dea",5875:"0efb64b9",6011:"941310dd",6061:"1f391b9e",6142:"3fd7c400",6203:"d527cc20",6317:"fd4196ca",6412:"761ae6cf",6557:"512b8e12",6604:"57b2c8d2",6776:"3fa38879",6969:"14eb3368",7062:"89442936",7098:"a7bd4aaa",7293:"1eec3456",7590:"1e5a94ee",7679:"3dd44a97",7882:"3d58f40e",7967:"7ec4066a",7972:"74b3184d",8194:"c7170f78",8198:"86b2e310",8334:"8a35765d",8401:"17896441",8497:"24d99165",8581:"935f2afb",8678:"321184fb",8703:"3f20655a",8908:"b4e94af8",9048:"a94703ab",9232:"4c993d98",9251:"300b4375",9289:"58765430",9583:"ae852ab6",9613:"8396e807",9647:"5e95c892",9651:"988781e2",9656:"03daf616",9886:"85949e05"}[e]||e)+"."+{26:"7facdaf1",241:"51737ab4",382:"0b7c3f1d",418:"091f205d",455:"6ea53531",485:"083f1a33",744:"3f2300ba",853:"f476fa0e",865:"b2e92db7",1005:"aab940ec",1051:"39e1b2c7",1369:"ca641bf6",1396:"27dc3fa6",1622:"734f8d19",1824:"436f8104",1938:"8f7694e9",2074:"c1fde12c",2237:"c97ebfc9",2240:"dcc3ae03",2266:"88c719f4",2365:"bfec9786",2388:"e09770ef",2501:"cd178830",2561:"a368c40d",2634:"5703f6bc",2674:"b72a0eb3",2708:"9b994f54",2938:"390e3d95",3468:"f798e451",3737:"7f6949d3",3952:"02118ce1",4078:"9b33c2b2",4107:"51fb9c35",4150:"c7fd8815",4171:"6460063b",4268:"82785b23",4279:"f554e1cf",4475:"c8e010c9",4506:"418e663d",4634:"cac9f252",4750:"a7832871",4787:"648af45f",4910:"c4ab3043",5072:"55816a58",5151:"019e7203",5179:"0e3855c8",5418:"ffcfe4d7",5535:"c63a3bd8",5606:"fd4de459",5621:"e220ef71",5747:"e04afd8e",5864:"406c39ce",5875:"8e4310e9",6011:"eabe2680",6061:"8e3b9443",6142:"1de7ac23",6203:"953e1a13",6317:"400ffa0b",6412:"40726746",6557:"ed4e3f0e",6604:"c9e19fb9",6776:"9e71e1be",6969:"f1620d39",7062:"38da3d47",7098:"9907b4db",7293:"d66c9967",7590:"14b89aab",7679:"e0a7a38d",7882:"0052478a",7967:"45a01cc4",7972:"785c6baf",8194:"65b76b94",8198:"baf90a1b",8334:"cefdf644",8401:"34fa3bc0",8497:"d0be0175",8581:"ad870565",8678:"fb090d73",8703:"db2c556f",8908:"31d34930",9048:"b3e1445a",9232:"6a6ba0ce",9251:"f971fad9",9289:"ece2e08a",9583:"4dd6870d",9613:"b0e3b499",9647:"674f41d0",9651:"aaf71cc9",9656:"5764601a",9886:"e5ef1554"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="documentation-v-2:",r.l=(e,a,b,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==b)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(b))),a)return a(b)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={11632215:"1938",17896441:"8401",53840870:"1622",58765430:"9289",89442936:"7062","8daeed5c":"26",bbe9a58b:"241",c02dc41d:"382",bcf52ae3:"418","7d04a44f":"455","53a37278":"485","224701f3":"744","2e4a270e":"853","48857ff6":"865",a78153fe:"1005",b48fe3d4:"1051",dd564d21:"1369","0261f7e4":"1396","4b3a11dc":"1824","7f42cc60":"2074",b221afeb:"2240","417623db":"2266","731a8187":"2365",fcb2fcfe:"2388",b8322650:"2501",c0ac7b9c:"2561",c4f5d8e4:"2634","88505e11":"2708",a61d05f4:"2938",b1373d58:"3468",a64fcdbf:"3737","7dbf6479":"3952","79300ddd":"4078","96b8ae89":"4107","3151510a":"4150","9812aca5":"4171","991561bb":"4268",df203c0f:"4279","641be602":"4475",ef2138f0:"4506","65f38bd9":"4634","0fc4b3a8":"4750","3720c009":"4787",cc3b42c3:"4910","9a4c38d3":"5072","55960ee5":"5151",c2be3d09:"5179","1623311b":"5418","44bbc5e7":"5535",d26ec100:"5606","3aa14dd0":"5621",bc2e11b2:"5747","78f64dea":"5864","0efb64b9":"5875","941310dd":"6011","1f391b9e":"6061","3fd7c400":"6142",d527cc20:"6203",fd4196ca:"6317","761ae6cf":"6412","512b8e12":"6557","57b2c8d2":"6604","3fa38879":"6776","14eb3368":"6969",a7bd4aaa:"7098","1eec3456":"7293","1e5a94ee":"7590","3dd44a97":"7679","3d58f40e":"7882","7ec4066a":"7967","74b3184d":"7972",c7170f78:"8194","86b2e310":"8198","8a35765d":"8334","24d99165":"8497","935f2afb":"8581","321184fb":"8678","3f20655a":"8703",b4e94af8:"8908",a94703ab:"9048","4c993d98":"9232","300b4375":"9251",ae852ab6:"9583","8396e807":"9613","5e95c892":"9647","988781e2":"9651","03daf616":"9656","85949e05":"9886"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,b)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)b.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise(((b,f)=>d=e[a]=[b,f]));b.push(d[2]=f);var c=r.p+r.u(a),t=new Error;r.l(c,(b=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=b&&("load"===b.type?"missing":b.type),c=b&&b.target&&b.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+c+")",t.name="ChunkLoadError",t.type=f,t.request=c,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,b)=>{var d,f,c=b[0],t=b[1],o=b[2],n=0;if(c.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(b);n{"use strict";var e,a,b,d,f,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var b=t[e]={id:e,loaded:!1,exports:{}};return c[e].call(b.exports,b,b.exports,r),b.loaded=!0,b.exports}r.m=c,r.c=t,e=[],r.O=(a,b,d,f)=>{if(!b){var c=1/0;for(i=0;i=f)&&Object.keys(r.O).every((e=>r.O[e](b[o])))?b.splice(o--,1):(t=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[b,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},b=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var c={};a=a||[null,b({}),b([]),b(b)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=b(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(f,c),f},r.d=(e,a)=>{for(var b in a)r.o(a,b)&&!r.o(e,b)&&Object.defineProperty(e,b,{enumerable:!0,get:a[b]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,b)=>(r.f[b](e,a),a)),[])),r.u=e=>"assets/js/"+({26:"8daeed5c",241:"bbe9a58b",382:"c02dc41d",418:"bcf52ae3",455:"7d04a44f",485:"53a37278",744:"224701f3",853:"2e4a270e",865:"48857ff6",1005:"a78153fe",1051:"b48fe3d4",1369:"dd564d21",1396:"0261f7e4",1622:"53840870",1824:"4b3a11dc",1938:"11632215",2074:"7f42cc60",2240:"b221afeb",2266:"417623db",2365:"731a8187",2388:"fcb2fcfe",2501:"b8322650",2561:"c0ac7b9c",2634:"c4f5d8e4",2708:"88505e11",2938:"a61d05f4",3468:"b1373d58",3737:"a64fcdbf",3952:"7dbf6479",4078:"79300ddd",4107:"96b8ae89",4150:"3151510a",4171:"9812aca5",4268:"991561bb",4279:"df203c0f",4475:"641be602",4506:"ef2138f0",4634:"65f38bd9",4750:"0fc4b3a8",4787:"3720c009",4910:"cc3b42c3",5072:"9a4c38d3",5151:"55960ee5",5179:"c2be3d09",5418:"1623311b",5535:"44bbc5e7",5606:"d26ec100",5621:"3aa14dd0",5747:"bc2e11b2",5864:"78f64dea",5875:"0efb64b9",6011:"941310dd",6061:"1f391b9e",6142:"3fd7c400",6203:"d527cc20",6317:"fd4196ca",6412:"761ae6cf",6557:"512b8e12",6604:"57b2c8d2",6776:"3fa38879",6969:"14eb3368",7062:"89442936",7098:"a7bd4aaa",7293:"1eec3456",7590:"1e5a94ee",7679:"3dd44a97",7882:"3d58f40e",7967:"7ec4066a",7972:"74b3184d",8194:"c7170f78",8198:"86b2e310",8334:"8a35765d",8401:"17896441",8497:"24d99165",8581:"935f2afb",8678:"321184fb",8703:"3f20655a",8908:"b4e94af8",9048:"a94703ab",9232:"4c993d98",9251:"300b4375",9289:"58765430",9583:"ae852ab6",9613:"8396e807",9647:"5e95c892",9651:"988781e2",9656:"03daf616",9886:"85949e05"}[e]||e)+"."+{26:"7facdaf1",241:"51737ab4",382:"0b7c3f1d",418:"091f205d",455:"6ea53531",485:"083f1a33",744:"3f2300ba",853:"f476fa0e",865:"b2e92db7",1005:"aab940ec",1051:"39e1b2c7",1369:"ca641bf6",1396:"27dc3fa6",1622:"734f8d19",1824:"436f8104",1938:"8f7694e9",2074:"c1fde12c",2237:"c97ebfc9",2240:"dcc3ae03",2266:"88c719f4",2365:"bfec9786",2388:"e09770ef",2501:"cd178830",2561:"a368c40d",2634:"5703f6bc",2674:"b72a0eb3",2708:"9b994f54",2938:"390e3d95",3468:"f798e451",3737:"7f6949d3",3952:"02118ce1",4078:"9b33c2b2",4107:"51fb9c35",4150:"c7fd8815",4171:"6460063b",4268:"82785b23",4279:"f554e1cf",4475:"c8e010c9",4506:"418e663d",4634:"cac9f252",4750:"a7832871",4787:"648af45f",4910:"c4ab3043",5072:"55816a58",5151:"019e7203",5179:"0e3855c8",5418:"ffcfe4d7",5535:"c63a3bd8",5606:"fd4de459",5621:"e220ef71",5747:"e04afd8e",5864:"406c39ce",5875:"8e4310e9",6011:"eabe2680",6061:"8e3b9443",6142:"1de7ac23",6203:"953e1a13",6317:"400ffa0b",6412:"40726746",6557:"ed4e3f0e",6604:"c9e19fb9",6776:"9e71e1be",6969:"f1620d39",7062:"38da3d47",7098:"9907b4db",7293:"d66c9967",7590:"14b89aab",7679:"e0a7a38d",7882:"0052478a",7967:"45a01cc4",7972:"785c6baf",8194:"65b76b94",8198:"baf90a1b",8334:"cefdf644",8401:"34fa3bc0",8497:"d0be0175",8581:"ad870565",8678:"fb090d73",8703:"9f0b06c2",8908:"31d34930",9048:"b3e1445a",9232:"6a6ba0ce",9251:"f971fad9",9289:"ece2e08a",9583:"4dd6870d",9613:"b0e3b499",9647:"674f41d0",9651:"aaf71cc9",9656:"5764601a",9886:"e5ef1554"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="documentation-v-2:",r.l=(e,a,b,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==b)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(b))),a)return a(b)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={11632215:"1938",17896441:"8401",53840870:"1622",58765430:"9289",89442936:"7062","8daeed5c":"26",bbe9a58b:"241",c02dc41d:"382",bcf52ae3:"418","7d04a44f":"455","53a37278":"485","224701f3":"744","2e4a270e":"853","48857ff6":"865",a78153fe:"1005",b48fe3d4:"1051",dd564d21:"1369","0261f7e4":"1396","4b3a11dc":"1824","7f42cc60":"2074",b221afeb:"2240","417623db":"2266","731a8187":"2365",fcb2fcfe:"2388",b8322650:"2501",c0ac7b9c:"2561",c4f5d8e4:"2634","88505e11":"2708",a61d05f4:"2938",b1373d58:"3468",a64fcdbf:"3737","7dbf6479":"3952","79300ddd":"4078","96b8ae89":"4107","3151510a":"4150","9812aca5":"4171","991561bb":"4268",df203c0f:"4279","641be602":"4475",ef2138f0:"4506","65f38bd9":"4634","0fc4b3a8":"4750","3720c009":"4787",cc3b42c3:"4910","9a4c38d3":"5072","55960ee5":"5151",c2be3d09:"5179","1623311b":"5418","44bbc5e7":"5535",d26ec100:"5606","3aa14dd0":"5621",bc2e11b2:"5747","78f64dea":"5864","0efb64b9":"5875","941310dd":"6011","1f391b9e":"6061","3fd7c400":"6142",d527cc20:"6203",fd4196ca:"6317","761ae6cf":"6412","512b8e12":"6557","57b2c8d2":"6604","3fa38879":"6776","14eb3368":"6969",a7bd4aaa:"7098","1eec3456":"7293","1e5a94ee":"7590","3dd44a97":"7679","3d58f40e":"7882","7ec4066a":"7967","74b3184d":"7972",c7170f78:"8194","86b2e310":"8198","8a35765d":"8334","24d99165":"8497","935f2afb":"8581","321184fb":"8678","3f20655a":"8703",b4e94af8:"8908",a94703ab:"9048","4c993d98":"9232","300b4375":"9251",ae852ab6:"9583","8396e807":"9613","5e95c892":"9647","988781e2":"9651","03daf616":"9656","85949e05":"9886"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,b)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)b.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise(((b,f)=>d=e[a]=[b,f]));b.push(d[2]=f);var c=r.p+r.u(a),t=new Error;r.l(c,(b=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=b&&("load"===b.type?"missing":b.type),c=b&&b.target&&b.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+c+")",t.name="ChunkLoadError",t.type=f,t.request=c,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,b)=>{var d,f,c=b[0],t=b[1],o=b[2],n=0;if(c.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(b);n Conditions générales de vente et d'utilisation | TiBillet - + diff --git a/docs/Tips/facebook/index.html b/docs/Tips/facebook/index.html index 8fb9ff15..a59e1f55 100644 --- a/docs/Tips/facebook/index.html +++ b/docs/Tips/facebook/index.html @@ -4,7 +4,7 @@ Social media posting | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/admin_add_new_event/index.html b/docs/Utilisateur/Billetterie/admin_add_new_event/index.html index 34e31b6b..89c6e034 100644 --- a/docs/Utilisateur/Billetterie/admin_add_new_event/index.html +++ b/docs/Utilisateur/Billetterie/admin_add_new_event/index.html @@ -4,7 +4,7 @@ Create a new event from A to Z | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html b/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html index 625d081e..6d129db5 100644 --- a/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html +++ b/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html @@ -4,7 +4,7 @@ Create a free event | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/iframe/index.html b/docs/Utilisateur/Billetterie/iframe/index.html index be4c9da5..200c5602 100644 --- a/docs/Utilisateur/Billetterie/iframe/index.html +++ b/docs/Utilisateur/Billetterie/iframe/index.html @@ -4,7 +4,7 @@ Integration | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/rss/index.html b/docs/Utilisateur/Billetterie/rss/index.html index 903d9133..34064a1b 100644 --- a/docs/Utilisateur/Billetterie/rss/index.html +++ b/docs/Utilisateur/Billetterie/rss/index.html @@ -4,7 +4,7 @@ RSS Feed | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/webhook/index.html b/docs/Utilisateur/Billetterie/webhook/index.html index 02a407af..7cab42d8 100644 --- a/docs/Utilisateur/Billetterie/webhook/index.html +++ b/docs/Utilisateur/Billetterie/webhook/index.html @@ -4,7 +4,7 @@ Webhook | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_article/index.html b/docs/Utilisateur/Cashless/admin_add_article/index.html index 7b5bd91c..be9411f0 100644 --- a/docs/Utilisateur/Cashless/admin_add_article/index.html +++ b/docs/Utilisateur/Cashless/admin_add_article/index.html @@ -4,7 +4,7 @@ Articles | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_categorie/index.html b/docs/Utilisateur/Cashless/admin_add_categorie/index.html index 15c08e43..c962ee0d 100644 --- a/docs/Utilisateur/Cashless/admin_add_categorie/index.html +++ b/docs/Utilisateur/Cashless/admin_add_categorie/index.html @@ -4,7 +4,7 @@ Article categories | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_pos/index.html b/docs/Utilisateur/Cashless/admin_add_pos/index.html index 64cd39bf..ac58b870 100644 --- a/docs/Utilisateur/Cashless/admin_add_pos/index.html +++ b/docs/Utilisateur/Cashless/admin_add_pos/index.html @@ -4,7 +4,7 @@ Points of sale | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_primary/index.html b/docs/Utilisateur/Cashless/admin_add_primary/index.html index 33317981..15261224 100644 --- a/docs/Utilisateur/Cashless/admin_add_primary/index.html +++ b/docs/Utilisateur/Cashless/admin_add_primary/index.html @@ -4,7 +4,7 @@ Primary Cards | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_supp/index.html b/docs/Utilisateur/Cashless/admin_supp/index.html index 2c5d77fb..a74f4169 100644 --- a/docs/Utilisateur/Cashless/admin_supp/index.html +++ b/docs/Utilisateur/Cashless/admin_supp/index.html @@ -4,7 +4,7 @@ Removing Orders | TiBillet - + diff --git a/docs/Utilisateur/Cashless/android/index.html b/docs/Utilisateur/Cashless/android/index.html index f830dbd7..72109782 100644 --- a/docs/Utilisateur/Cashless/android/index.html +++ b/docs/Utilisateur/Cashless/android/index.html @@ -4,7 +4,7 @@ Android application | TiBillet - + diff --git a/docs/Utilisateur/Cashless/badge/index.html b/docs/Utilisateur/Cashless/badge/index.html index 6ab16e3d..8793112f 100644 --- a/docs/Utilisateur/Cashless/badge/index.html +++ b/docs/Utilisateur/Cashless/badge/index.html @@ -4,7 +4,7 @@ Time clock machine | TiBillet - + diff --git a/docs/Utilisateur/Cashless/cashback/index.html b/docs/Utilisateur/Cashless/cashback/index.html index 14bfbb04..b3f31260 100644 --- a/docs/Utilisateur/Cashless/cashback/index.html +++ b/docs/Utilisateur/Cashless/cashback/index.html @@ -4,7 +4,7 @@ Cashback | TiBillet - + diff --git a/docs/Utilisateur/Cashless/fidelity/index.html b/docs/Utilisateur/Cashless/fidelity/index.html index 79d1b154..25e23821 100644 --- a/docs/Utilisateur/Cashless/fidelity/index.html +++ b/docs/Utilisateur/Cashless/fidelity/index.html @@ -4,7 +4,7 @@ Loyalty points | TiBillet - + diff --git a/docs/Utilisateur/Cashless/impression_preparation/index.html b/docs/Utilisateur/Cashless/impression_preparation/index.html index 2080edcd..aba2ca09 100644 --- a/docs/Utilisateur/Cashless/impression_preparation/index.html +++ b/docs/Utilisateur/Cashless/impression_preparation/index.html @@ -4,7 +4,7 @@ Printing orders | TiBillet - + diff --git a/docs/api/apikey/index.html b/docs/api/apikey/index.html index 0f617c64..fe6bd161 100644 --- a/docs/api/apikey/index.html +++ b/docs/api/apikey/index.html @@ -4,7 +4,7 @@ API Keys | TiBillet - + diff --git a/docs/api/events/index.html b/docs/api/events/index.html index c4e96693..3d343dbe 100644 --- a/docs/api/events/index.html +++ b/docs/api/events/index.html @@ -4,7 +4,7 @@ Évènements | TiBillet - + diff --git a/docs/api/intro/index.html b/docs/api/intro/index.html index 026494d3..42f72363 100644 --- a/docs/api/intro/index.html +++ b/docs/api/intro/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/docs/api/products/index.html b/docs/api/products/index.html index 4ccca070..0921cc04 100644 --- a/docs/api/products/index.html +++ b/docs/api/products/index.html @@ -4,7 +4,7 @@ Produits | TiBillet - + diff --git a/docs/api/reservations/index.html b/docs/api/reservations/index.html index 342faa29..abb7237b 100644 --- a/docs/api/reservations/index.html +++ b/docs/api/reservations/index.html @@ -4,7 +4,7 @@ Réservations et billets | TiBillet - + diff --git a/docs/api/tenants/index.html b/docs/api/tenants/index.html index e5b9e38f..fd572e60 100644 --- a/docs/api/tenants/index.html +++ b/docs/api/tenants/index.html @@ -4,7 +4,7 @@ Tenants | TiBillet - + diff --git a/docs/category/api/index.html b/docs/category/api/index.html index d95eb496..23633ccb 100644 --- a/docs/category/api/index.html +++ b/docs/category/api/index.html @@ -4,7 +4,7 @@ API | TiBillet - + diff --git a/docs/category/billetterie/index.html b/docs/category/billetterie/index.html index 538ef651..0b464a4b 100644 --- a/docs/category/billetterie/index.html +++ b/docs/category/billetterie/index.html @@ -4,7 +4,7 @@ Ticketing | TiBillet - + diff --git a/docs/category/cashless/index.html b/docs/category/cashless/index.html index 39bcf250..7e65cd43 100644 --- a/docs/category/cashless/index.html +++ b/docs/category/cashless/index.html @@ -4,7 +4,7 @@ Cashless | TiBillet - + diff --git a/docs/category/diy/index.html b/docs/category/diy/index.html index f475433d..7824ff57 100644 --- a/docs/category/diy/index.html +++ b/docs/category/diy/index.html @@ -4,7 +4,7 @@ DIY | TiBillet - + diff --git a/docs/category/documentation-utilisateur/index.html b/docs/category/documentation-utilisateur/index.html index adebe0ff..2d512b86 100644 --- a/docs/category/documentation-utilisateur/index.html +++ b/docs/category/documentation-utilisateur/index.html @@ -4,7 +4,7 @@ User documentation | TiBillet - + diff --git "a/docs/category/pr\303\251sentation/index.html" "b/docs/category/pr\303\251sentation/index.html" index 393f7b91..3f9c3f5c 100644 --- "a/docs/category/pr\303\251sentation/index.html" +++ "b/docs/category/pr\303\251sentation/index.html" @@ -4,7 +4,7 @@ Presentation | TiBillet - + diff --git a/docs/category/trucs-et-astuces/index.html b/docs/category/trucs-et-astuces/index.html index b0643af4..f64e60c7 100644 --- a/docs/category/trucs-et-astuces/index.html +++ b/docs/category/trucs-et-astuces/index.html @@ -4,7 +4,7 @@ Tips and tricks | TiBillet - + diff --git a/docs/install/docker_install/index.html b/docs/install/docker_install/index.html index 9cb0bf14..ac4df022 100644 --- a/docs/install/docker_install/index.html +++ b/docs/install/docker_install/index.html @@ -4,7 +4,7 @@ Self hosted TiBillet instances | TiBillet - + @@ -101,10 +101,10 @@

# prepare the logs, assets, backup and database folder
mkdir logs www backup database nginx

Create .env file and fill it with your own variable

# Secret
DJANGO_SECRET='' # see upper to create one
FERNET_KEY='' # see upper to create one

STRIPE_KEY='' # from your stripe account
# or
STRIPE_KEY_TEST=''
STRIPE_TEST=0 # set to 1 for use stripe test env

# Database
POSTGRES_HOST='lespass_postgres'
POSTGRES_USER='lespass_postgres_user'
POSTGRES_PASSWORD='' # strong ! generate a new fernet for exemple.
POSTGRES_DB='lespass'

TIME_ZONE='Europe/Paris' # or where you are
PUBLIC='TiBillet Coop.' # The name of the root instance

FEDOW_DOMAIN='' # the same as Fedow

DOMAIN='' # for the wildcard : without subdomain ! ex : tibillet.coop, not lespass.tibillet.coop
SUB='' # the sub domain of your first place ex : if 'festival', it will be accessible on https://festival.tibillet.coop
META='' # the federated agenda for all events on all tenants. If 'agenda', it will be accessible, for exemple, on https://agenda.tibillet.coop

# For transactionnal email :
EMAIL_HOST=''
EMAIL_PORT=''
EMAIL_HOST_USER=''
EMAIL_HOST_PASSWORD=''

# Change only if needed :
CELERY_BROKER='redis://redis:6379/0'
CELERY_BACKEND='redis://redis:6379/0'
-

The docker-compose.yml file

-
services:
lespass_postgres:
image: postgres:13-bookworm
restart: unless-stopped
container_name: lespass_postgres
hostname: lespass_postgres
volumes:
- ./database/data:/var/lib/postgresql/data
env_file: .env
networks:
- lespass_backend

lespas_memcached:
image : memcached:1.6
container_name: lespas_memcached
hostname: lespas_memcached
restart: always
networks:
- lespass_backend

lespas_redis:
container_name: lespas_redis
hostname: lespas_redis
image: redis:7.2.3-bookworm
restart: unless-stopped
networks:
- lespass_backend

lespass_django:
image: tibillet/lespass:latest
restart: unless-stopped
container_name: lespass_django
hostname: lespass_django
volumes:
- ./www:/DjangoFiles/www
- ./logs:/DjangoFiles/logs
- ./backup:/Backup
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"

lespass_celery:
image: tibillet/lespass:latest
container_name: lespass_celery
hostname: lespass_celery
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"
command: "poetry run celery -A TiBillet worker -l INFO"


lespass_nginx:
image: nginx:latest
container_name: lespass_nginx
hostname: lespass_nginx
links:
- lespass_django:lespass_django
volumes:
- ./www:/www
- ./logs:/logs
- ./nginx:/etc/nginx/conf.d
labels:
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.lespass_nginx.tls.certresolver=myresolver
- traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)
- traefik.http.services.lespass_nginx.loadbalancer.server.port=80
networks:
- frontend
- lespass_backend



networks:
frontend:
external: true
lespass_backend:

Nginx rules

Créate the file with nano nginx/lespass.conf

-
server {

listen 80;
server_name localhost;

access_log /logs/nginxAccess.log;
error_log /logs/nginxError.log;

location /static {
root /www;
}

location /media {
root /www;
}

location / {
# everything is passed to Gunicorn
proxy_pass http://lespass_django:8002;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
client_max_body_size 4M;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
}
}

+
server {

listen 80;
server_name localhost;

access_log /logs/nginxAccess.log;
error_log /logs/nginxError.log;

location /static {
root /www;
}

location /media {
root /www;
}

location / {
# everything is passed to Gunicorn
proxy_pass http://lespass_django:8002;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
client_max_body_size 4M;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
}
}

+

The docker-compose.yml file

+
services:
lespass_postgres:
image: postgres:13-bookworm
restart: unless-stopped
container_name: lespass_postgres
hostname: lespass_postgres
volumes:
- ./database/data:/var/lib/postgresql/data
env_file: .env
networks:
- lespass_backend

lespas_memcached:
image : memcached:1.6
container_name: lespas_memcached
hostname: lespas_memcached
restart: always
networks:
- lespass_backend

lespas_redis:
container_name: lespas_redis
hostname: lespas_redis
image: redis:7.2.3-bookworm
restart: unless-stopped
networks:
- lespass_backend

lespass_django:
image: tibillet/lespass:latest
restart: unless-stopped
container_name: lespass_django
hostname: lespass_django
volumes:
- ./www:/DjangoFiles/www
- ./logs:/DjangoFiles/logs
- ./backup:/Backup
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"

lespass_celery:
image: tibillet/lespass:latest
container_name: lespass_celery
hostname: lespass_celery
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"
command: "poetry run celery -A TiBillet worker -l INFO"


lespass_nginx:
image: nginx:latest
container_name: lespass_nginx
hostname: lespass_nginx
links:
- lespass_django:lespass_django
volumes:
- ./www:/www
- ./logs:/logs
- ./nginx:/etc/nginx/conf.d
labels:
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.lespass_nginx.tls.certresolver=myresolver
- traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)
- traefik.http.services.lespass_nginx.loadbalancer.server.port=80
networks:
- frontend
- lespass_backend



networks:
frontend:
external: true
lespass_backend:

\ No newline at end of file diff --git a/docs/install/raspberry/index.html b/docs/install/raspberry/index.html index 436cd62f..9f73dc3d 100644 --- a/docs/install/raspberry/index.html +++ b/docs/install/raspberry/index.html @@ -4,7 +4,7 @@ Raspberry Box - Hardware | TiBillet - + diff --git a/docs/install/raspberry_soft/index.html b/docs/install/raspberry_soft/index.html index cc117390..c444b39c 100644 --- a/docs/install/raspberry_soft/index.html +++ b/docs/install/raspberry_soft/index.html @@ -4,7 +4,7 @@ Raspberry Box - Software | TiBillet - + diff --git a/docs/presentation/demonstration/index.html b/docs/presentation/demonstration/index.html index 73543c55..a93aaad2 100644 --- a/docs/presentation/demonstration/index.html +++ b/docs/presentation/demonstration/index.html @@ -4,7 +4,7 @@ Demonstration | TiBillet - + diff --git a/docs/presentation/introduction/index.html b/docs/presentation/introduction/index.html index 4472de85..97e068b8 100644 --- a/docs/presentation/introduction/index.html +++ b/docs/presentation/introduction/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/docs/presentation/logos/index.html b/docs/presentation/logos/index.html index 34f05131..2954d1a3 100644 --- a/docs/presentation/logos/index.html +++ b/docs/presentation/logos/index.html @@ -4,7 +4,7 @@ Logos | TiBillet - + diff --git a/docs/presentation/philosophie/index.html b/docs/presentation/philosophie/index.html index 54770de3..76c83f95 100644 --- a/docs/presentation/philosophie/index.html +++ b/docs/presentation/philosophie/index.html @@ -4,7 +4,7 @@ Philosophy | TiBillet - + diff --git a/docs/presentation/tarifs/index.html b/docs/presentation/tarifs/index.html index d48b897c..47024d8b 100644 --- a/docs/presentation/tarifs/index.html +++ b/docs/presentation/tarifs/index.html @@ -4,7 +4,7 @@ Prices, conditions and licenses | TiBillet - + diff --git a/docs/presentation/usages/index.html b/docs/presentation/usages/index.html index 1704ad19..79e4b1b9 100644 --- a/docs/presentation/usages/index.html +++ b/docs/presentation/usages/index.html @@ -4,7 +4,7 @@ Uses | TiBillet - + diff --git a/docs/tags/access-card/index.html b/docs/tags/access-card/index.html index b2d23f42..714e71e7 100644 --- a/docs/tags/access-card/index.html +++ b/docs/tags/access-card/index.html @@ -4,7 +4,7 @@ One doc tagged with "access card" | TiBillet - + diff --git a/docs/tags/associations/index.html b/docs/tags/associations/index.html index 8b16bb95..83cf9afa 100644 --- a/docs/tags/associations/index.html +++ b/docs/tags/associations/index.html @@ -4,7 +4,7 @@ One doc tagged with "associations" | TiBillet - + diff --git a/docs/tags/badge-inter-lieux/index.html b/docs/tags/badge-inter-lieux/index.html index a090594d..860e7769 100644 --- a/docs/tags/badge-inter-lieux/index.html +++ b/docs/tags/badge-inter-lieux/index.html @@ -4,7 +4,7 @@ One doc tagged with "badge inter-lieux" | TiBillet - + diff --git a/docs/tags/billetterie/index.html b/docs/tags/billetterie/index.html index ef9255df..dcba2d87 100644 --- a/docs/tags/billetterie/index.html +++ b/docs/tags/billetterie/index.html @@ -4,7 +4,7 @@ 4 docs tagged with "billetterie" | TiBillet - + diff --git a/docs/tags/caisse-enregistreuse/index.html b/docs/tags/caisse-enregistreuse/index.html index 6373e7d9..45be4db5 100644 --- a/docs/tags/caisse-enregistreuse/index.html +++ b/docs/tags/caisse-enregistreuse/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "caisse enregistreuse" | TiBillet - + diff --git a/docs/tags/card/index.html b/docs/tags/card/index.html index 5f4de652..dbb17b1d 100644 --- a/docs/tags/card/index.html +++ b/docs/tags/card/index.html @@ -4,7 +4,7 @@ One doc tagged with "card" | TiBillet - + diff --git a/docs/tags/cash-register/index.html b/docs/tags/cash-register/index.html index dcc41291..fce6667f 100644 --- a/docs/tags/cash-register/index.html +++ b/docs/tags/cash-register/index.html @@ -4,7 +4,7 @@ One doc tagged with "cash register" | TiBillet - + diff --git a/docs/tags/cashback/index.html b/docs/tags/cashback/index.html index 8032f521..82c17082 100644 --- a/docs/tags/cashback/index.html +++ b/docs/tags/cashback/index.html @@ -4,7 +4,7 @@ One doc tagged with "cashback" | TiBillet - + diff --git a/docs/tags/cashless/index.html b/docs/tags/cashless/index.html index 561fd1f0..70b18c32 100644 --- a/docs/tags/cashless/index.html +++ b/docs/tags/cashless/index.html @@ -4,7 +4,7 @@ 4 docs tagged with "cashless" | TiBillet - + diff --git a/docs/tags/catering/index.html b/docs/tags/catering/index.html index 5f392c59..6f7f207d 100644 --- a/docs/tags/catering/index.html +++ b/docs/tags/catering/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "catering" | TiBillet - + diff --git a/docs/tags/cooperative/index.html b/docs/tags/cooperative/index.html index dd19b0b8..193fac60 100644 --- a/docs/tags/cooperative/index.html +++ b/docs/tags/cooperative/index.html @@ -4,7 +4,7 @@ One doc tagged with "coopérative" | TiBillet - + diff --git a/docs/tags/dematerialized-payment/index.html b/docs/tags/dematerialized-payment/index.html index e7b0a272..d78a9e5f 100644 --- a/docs/tags/dematerialized-payment/index.html +++ b/docs/tags/dematerialized-payment/index.html @@ -4,7 +4,7 @@ One doc tagged with "dematerialized payment" | TiBillet - + diff --git a/docs/tags/demonstration/index.html b/docs/tags/demonstration/index.html index eb6598ed..9f66a27f 100644 --- a/docs/tags/demonstration/index.html +++ b/docs/tags/demonstration/index.html @@ -4,7 +4,7 @@ One doc tagged with "démonstration" | TiBillet - + diff --git a/docs/tags/dokos/index.html b/docs/tags/dokos/index.html index 0dd3f20c..61fa7bc8 100644 --- a/docs/tags/dokos/index.html +++ b/docs/tags/dokos/index.html @@ -4,7 +4,7 @@ One doc tagged with "dokos" | TiBillet - + diff --git a/docs/tags/events/index.html b/docs/tags/events/index.html index 0cc53f61..79bde52b 100644 --- a/docs/tags/events/index.html +++ b/docs/tags/events/index.html @@ -4,7 +4,7 @@ One doc tagged with "events" | TiBillet - + diff --git a/docs/tags/federated/index.html b/docs/tags/federated/index.html index 1a0ec87b..fea40fd5 100644 --- a/docs/tags/federated/index.html +++ b/docs/tags/federated/index.html @@ -4,7 +4,7 @@ One doc tagged with "federated" | TiBillet - + diff --git a/docs/tags/festival/index.html b/docs/tags/festival/index.html index b80b44f5..362e5a51 100644 --- a/docs/tags/festival/index.html +++ b/docs/tags/festival/index.html @@ -4,7 +4,7 @@ One doc tagged with "festival" | TiBillet - + diff --git a/docs/tags/fidelite/index.html b/docs/tags/fidelite/index.html index 5eb66451..5b87d284 100644 --- a/docs/tags/fidelite/index.html +++ b/docs/tags/fidelite/index.html @@ -4,7 +4,7 @@ One doc tagged with "fidélité" | TiBillet - + diff --git a/docs/tags/fidelity/index.html b/docs/tags/fidelity/index.html index 3558031d..cc8456bc 100644 --- a/docs/tags/fidelity/index.html +++ b/docs/tags/fidelity/index.html @@ -4,7 +4,7 @@ One doc tagged with "fidelity" | TiBillet - + diff --git a/docs/tags/free-software/index.html b/docs/tags/free-software/index.html index adaa7da6..175e7484 100644 --- a/docs/tags/free-software/index.html +++ b/docs/tags/free-software/index.html @@ -4,7 +4,7 @@ One doc tagged with "free software" | TiBillet - + diff --git a/docs/tags/index.html b/docs/tags/index.html index 73487fb3..ef5ed543 100644 --- a/docs/tags/index.html +++ b/docs/tags/index.html @@ -4,7 +4,7 @@ Tags | TiBillet - + diff --git a/docs/tags/local-currencies/index.html b/docs/tags/local-currencies/index.html index 45c77a3f..d8248bda 100644 --- a/docs/tags/local-currencies/index.html +++ b/docs/tags/local-currencies/index.html @@ -4,7 +4,7 @@ One doc tagged with "local currencies" | TiBillet - + diff --git a/docs/tags/logiciel-libre/index.html b/docs/tags/logiciel-libre/index.html index 6d713fc4..6c2705fd 100644 --- a/docs/tags/logiciel-libre/index.html +++ b/docs/tags/logiciel-libre/index.html @@ -4,7 +4,7 @@ One doc tagged with "logiciel libre" | TiBillet - + diff --git a/docs/tags/loyalty/index.html b/docs/tags/loyalty/index.html index f44f311c..a14847e0 100644 --- a/docs/tags/loyalty/index.html +++ b/docs/tags/loyalty/index.html @@ -4,7 +4,7 @@ One doc tagged with "loyalty" | TiBillet - + diff --git a/docs/tags/monnaie-locale/index.html b/docs/tags/monnaie-locale/index.html index 877c06e4..9ab8cb81 100644 --- a/docs/tags/monnaie-locale/index.html +++ b/docs/tags/monnaie-locale/index.html @@ -4,7 +4,7 @@ One doc tagged with "monnaie locale" | TiBillet - + diff --git a/docs/tags/monnaies-locales/index.html b/docs/tags/monnaies-locales/index.html index 7d8f9f44..bb464479 100644 --- a/docs/tags/monnaies-locales/index.html +++ b/docs/tags/monnaies-locales/index.html @@ -4,7 +4,7 @@ One doc tagged with "monnaies locales" | TiBillet - + diff --git a/docs/tags/monnaies-temps/index.html b/docs/tags/monnaies-temps/index.html index 74f66df8..401b16b8 100644 --- a/docs/tags/monnaies-temps/index.html +++ b/docs/tags/monnaies-temps/index.html @@ -4,7 +4,7 @@ One doc tagged with "monnaies temps" | TiBillet - + diff --git a/docs/tags/open-source/index.html b/docs/tags/open-source/index.html index 9d21e871..6c532878 100644 --- a/docs/tags/open-source/index.html +++ b/docs/tags/open-source/index.html @@ -4,7 +4,7 @@ One doc tagged with "open source" | TiBillet - + diff --git a/docs/tags/order-taking/index.html b/docs/tags/order-taking/index.html index 394e0dcc..fc4f30ad 100644 --- a/docs/tags/order-taking/index.html +++ b/docs/tags/order-taking/index.html @@ -4,7 +4,7 @@ One doc tagged with "order taking" | TiBillet - + diff --git a/docs/tags/paiement-dematerialise/index.html b/docs/tags/paiement-dematerialise/index.html index 0d770c00..47f935c5 100644 --- a/docs/tags/paiement-dematerialise/index.html +++ b/docs/tags/paiement-dematerialise/index.html @@ -4,7 +4,7 @@ One doc tagged with "paiement dématérialisé" | TiBillet - + diff --git a/docs/tags/prise-de-commandes/index.html b/docs/tags/prise-de-commandes/index.html index 8462e46c..a8a52ab6 100644 --- a/docs/tags/prise-de-commandes/index.html +++ b/docs/tags/prise-de-commandes/index.html @@ -4,7 +4,7 @@ One doc tagged with "prise de commandes" | TiBillet - + diff --git a/docs/tags/stripe/index.html b/docs/tags/stripe/index.html index 8d8d4d2f..13e250c5 100644 --- a/docs/tags/stripe/index.html +++ b/docs/tags/stripe/index.html @@ -4,7 +4,7 @@ One doc tagged with "stripe" | TiBillet - + diff --git a/docs/tags/ticketing/index.html b/docs/tags/ticketing/index.html index 5539a4b2..9f54d999 100644 --- a/docs/tags/ticketing/index.html +++ b/docs/tags/ticketing/index.html @@ -4,7 +4,7 @@ 4 docs tagged with "ticketing" | TiBillet - + diff --git a/docs/tags/tiers-lieux/index.html b/docs/tags/tiers-lieux/index.html index 85c7e75e..0905f08a 100644 --- a/docs/tags/tiers-lieux/index.html +++ b/docs/tags/tiers-lieux/index.html @@ -4,7 +4,7 @@ One doc tagged with "tiers-lieux" | TiBillet - + diff --git a/docs/tags/time-currencies/index.html b/docs/tags/time-currencies/index.html index e1a6a203..cb3a1635 100644 --- a/docs/tags/time-currencies/index.html +++ b/docs/tags/time-currencies/index.html @@ -4,7 +4,7 @@ One doc tagged with "time currencies" | TiBillet - + diff --git a/docs/tags/venue/index.html b/docs/tags/venue/index.html index 5a61191a..27f89cdd 100644 --- a/docs/tags/venue/index.html +++ b/docs/tags/venue/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "venue" | TiBillet - + diff --git a/fr/404.html b/fr/404.html index 26d0d898..b75e4f8b 100644 --- a/fr/404.html +++ b/fr/404.html @@ -4,7 +4,7 @@ Page introuvable | TiBillet - + diff --git a/fr/assets/js/a4a43940.019bd91f.js b/fr/assets/js/a4a43940.1eec1011.js similarity index 80% rename from fr/assets/js/a4a43940.019bd91f.js rename to fr/assets/js/a4a43940.1eec1011.js index a66a6ad2..064e97d8 100644 --- a/fr/assets/js/a4a43940.019bd91f.js +++ b/fr/assets/js/a4a43940.1eec1011.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[4831],{2564:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>d});var r=s(4848),o=s(8453);const t={sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},i=void 0,a={id:"install/server_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",source:"@site/i18n/fr/docusaurus-plugin-content-docs/current/install/server_install.md",sourceDirName:"install",slug:"/install/docker_install",permalink:"/fr/docs/install/docker_install",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/install/server_install.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},sidebar:"tutorialSidebar",previous:{title:"Raspberry Box - Software",permalink:"/fr/docs/install/raspberry_soft"},next:{title:"API",permalink:"/fr/docs/category/api"}},l={},d=[{value:"Legal warning",id:"legal-warning",level:2},{value:"Introduction to Engines",id:"introduction-to-engines",level:2},{value:"Generate many Fernet key and django secret key",id:"generate-many-fernet-key-and-django-secret-key",level:3},{value:"Fedow : One ring to rule them all",id:"fedow--one-ring-to-rule-them-all",level:2},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable",level:3},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch",level:3},{value:"Nginx rules",id:"nginx-rules",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file",level:3},{value:"Launch the rocket !",id:"launch-the-rocket-",level:3},{value:"Backup",id:"backup",level:3},{value:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill.",id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",level:2},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch-1",level:3},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable-1",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file-1",level:3},{value:"Nginx rules",id:"nginx-rules-1",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"legal-warning",children:"Legal warning"}),"\n",(0,r.jsxs)(n.admonition,{type:"danger",children:[(0,r.jsxs)(n.p,{children:["Since January 1, 2018, in order to combat VAT fraud, all VAT-registered professionals recording\ncustomer payments using one of these software or systems are required to use secure, ",(0,r.jsx)(n.strong,{children:"certified hardware"}),"."]}),(0,r.jsxs)(n.p,{children:["A measure enshrined in\n",(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"Article 286 3\xb0 bis of the General Tax Code"}),"\nand initially stemming from the 2016 Finance Act,\nwhen ",(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"April"}),"\nbecame involved in promoting and defending open-source\nsoftware with cashiering functions."]}),(0,r.jsxs)(n.p,{children:["If you're using ",(0,r.jsx)(n.a,{href:"/docs/presentation/tarifs",children:"TiBillet's Coop' and SaaS model"}),", you don't need to worry about any of\nthis : We provide you with the certificate."]}),(0,r.jsx)(n.p,{children:"But if you self-host your own cash register instance, you legally become the publisher, and we can't provide you with\nany legal documents to present to the tax authorities."}),(0,r.jsx)(n.p,{children:"I imagine that if you're here, it's to install it yourself ;)"}),(0,r.jsx)(n.p,{children:"Here you are informed!"})]}),"\n",(0,r.jsx)(n.p,{children:"More information here (in french) :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse",children:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"introduction-to-engines",children:"Introduction to Engines"}),"\n",(0,r.jsx)(n.p,{children:"Tibillet is a software suite composed of several interoperable building blocks. The engines are :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Fedow",children:"Fedow"}),": Federated and open wallet, the federation engine. A PoA and Rsa key based\nblockchain to\nshare membership assets, local currencies and\ntime for several Lespass and LaBoutik instances."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Lespass",children:"Lespass"}),": Ticketing, booking, membership and landing page engines. Usefull too\nfor refill online with self scanned qrcode unique on each card."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/LaBoutik",children:"LaBoutik"}),": Cash register, cashless system with RFID / NFC chip and order-taking\nsystem."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"To get the full functionality of TiBillet, you need to install these three engines."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Fedow"})," for multiple locations (RSA based PoA blockchain)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Lespass"})," for multiple locations (Django multi-tenant)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Laboutik"})," per location, which connects to a fedow and a lespass to join a federation."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{title:"Exemple",type:"note",children:(0,r.jsxs)(n.p,{children:["if you want to use the same NFC card to manage cashless at 2 festivals and 3 community caf\xe9s, you'll need 5\n",(0,r.jsx)(n.strong,{children:"LabouTik"}),", but only one ",(0,r.jsx)(n.strong,{children:"Fedow"})," for the federated asset, and one ",(0,r.jsx)(n.strong,{children:"Lespass"})," for the webpage of each venue.\nThe same applies if you want to manage a co-working subscription for a\ngroup of ",(0,r.jsx)(n.em,{children:"third place"})," in a given city/region/department."]})}),"\n",(0,r.jsx)(n.h1,{id:"requirements-",children:"Requirements :"}),"\n",(0,r.jsxs)(n.p,{children:["For security and performance reasons, we recommend that you separate the ",(0,r.jsx)(n.strong,{children:"Lespass"})," public area from the ",(0,r.jsx)(n.strong,{children:"LaBoutik"}),"\ncheckout and ",(0,r.jsx)(n.strong,{children:"Fedow"})," federation engines."]}),"\n",(0,r.jsx)(n.p,{children:"For dev' and test purpose, you can install everything on one VPS. Here the minimal requirements :"}),"\n",(0,r.jsx)(n.p,{children:"A linux server with :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"2 vCpu / 4Go Ram"}),"\n",(0,r.jsx)(n.li,{children:"Docker & Compose"}),"\n",(0,r.jsx)(n.li,{children:"1 domain with wildcard capacity"}),"\n",(0,r.jsx)(n.li,{children:"A Reverse proxy who handle 443 and 80 port (we use Traefik)"}),"\n",(0,r.jsxs)(n.li,{children:["A valid Stripe account with ",(0,r.jsx)(n.em,{children:"Stripe connect"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can find some ressource (in french) here :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If you're ready for adventure, create a new folder \"TiBillet\", and let's start by installing a Fedow!"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet && cd TiBillet\n"})}),"\n",(0,r.jsx)(n.h3,{id:"generate-many-fernet-key-and-django-secret-key",children:"Generate many Fernet key and django secret key"}),"\n",(0,r.jsx)(n.p,{children:"You will need 3 couple of Fernet/Django secret key."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Generate fernet key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from cryptography.fernet import Fernet; print('\\n'.join([Fernet.generate_key().decode('utf-8') for i in range(0,30)]))\"\n\n# Generate django secret key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from django.core.management.utils import get_random_secret_key; print('\\n'.join([get_random_secret_key() for i in range(0,30)]))\"\n"})}),"\n",(0,r.jsx)(n.h2,{id:"fedow--one-ring-to-rule-them-all",children:"Fedow : One ring to rule them all"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Fedow && cd TiBillet/Fedow\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create .env and fill with :\nSECRET_KEY='' # see upper to create one\nFERNET_KEY='' # see upper to create one\nDOMAIN='' # ex : fedow.domain.com\nSTRIPE_KEY='' # from your stripe account\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create frontend and backend network with docker\ndocker network create frontend\ndocker network create fedow_backend\n\n# prepare the logs, assets, database and nginx conf folder\nmkdir logs www database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/django.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"server {\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://fedow_django:8000;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header Host $host;\n proxy_redirect off;\n }\n}\n"})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"services:\n fedow_memcached:\n image: memcached:1.6\n container_name: fedow_memcached\n hostname: fedow_memcached\n restart: always\n networks:\n - fedow_backend\n \n fedow_django:\n image: tibillet/fedow:latest\n container_name: fedow_django\n hostname: fedow_django\n restart: always\n env_file: .env\n user: fedow\n volumes:\n - ./database:/home/fedow/Fedow/database\n - ./www:/home/fedow/Fedow/www\n - ./logs:/home/fedow/Fedow/logs\n links:\n - fedow_memcached:memcached\n networks:\n - fedow_backend\n\n fedow_nginx:\n image: nginx:latest\n restart: always\n container_name: fedow_nginx\n hostname: fedow_nginx\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n depends_on:\n - fedow_django\n links:\n - fedow_django:fedow_django\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.fedow_nginx.tls.certresolver=myresolver\n - traefik.http.routers.fedow_nginx.rule=Host(`$DOMAIN`)\n - traefik.http.services.fedow_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - fedow_backend\n\n\nnetworks:\n frontend:\n external: true\n fedow_backend:\n"})}),"\n",(0,r.jsx)(n.h3,{id:"launch-the-rocket-",children:"Launch the rocket !"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d \n# To see the logs :\ndocker compose logs -f \n"})}),"\n",(0,r.jsxs)(n.p,{children:["And check to ",(0,r.jsx)(n.code,{children:"https:///dashboard"})]}),"\n",(0,r.jsx)(n.p,{children:"Congratulation, You own your blockchain ;)"}),"\n",(0,r.jsx)(n.h3,{id:"backup",children:"Backup"}),"\n",(0,r.jsx)(n.p,{children:"To make a backup, simply back up the database folder regularly."}),"\n",(0,r.jsx)(n.h2,{id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",children:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill."}),"\n",(0,r.jsxs)(n.p,{children:["Lespass is a multi-tenant engine. It is designed to work with a traefik and a wildcard certificate. See\nthe ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/",children:"Code Commun blog"})," for\nexemple : ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})]}),"\n",(0,r.jsx)(n.p,{children:"For a test and development environment, it can be run on the same environment as Fedow :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Lespass && cd TiBillet/Lespass\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch-1",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# prepare the logs, assets, backup and database folder\nmkdir logs www backup database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable-1",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Secret\nDJANGO_SECRET='' # see upper to create one\nFERNET_KEY='' # see upper to create one\n\nSTRIPE_KEY='' # from your stripe account\n# or \nSTRIPE_KEY_TEST=''\nSTRIPE_TEST=0 # set to 1 for use stripe test env\n\n# Database\nPOSTGRES_HOST='lespass_postgres'\nPOSTGRES_USER='lespass_postgres_user'\nPOSTGRES_PASSWORD='' # strong ! generate a new fernet for exemple.\nPOSTGRES_DB='lespass'\n\nTIME_ZONE='Europe/Paris' # or where you are\nPUBLIC='TiBillet Coop.' # The name of the root instance\n\nFEDOW_DOMAIN='' # the same as Fedow\n\nDOMAIN='' # for the wildcard : without subdomain ! ex : tibillet.coop, not lespass.tibillet.coop\nSUB='' # the sub domain of your first place ex : if 'festival', it will be accessible on https://festival.tibillet.coop\nMETA='' # the federated agenda for all events on all tenants. If 'agenda', it will be accessible, for exemple, on https://agenda.tibillet.coop\n\n# For transactionnal email : \nEMAIL_HOST=''\nEMAIL_PORT=''\nEMAIL_HOST_USER=''\nEMAIL_HOST_PASSWORD=''\n\n# Change only if needed :\nCELERY_BROKER='redis://redis:6379/0'\nCELERY_BACKEND='redis://redis:6379/0'\n"})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file-1",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'services:\n lespass_postgres:\n image: postgres:13-bookworm\n restart: unless-stopped\n container_name: lespass_postgres\n hostname: lespass_postgres\n volumes:\n - ./database/data:/var/lib/postgresql/data\n env_file: .env\n networks:\n - lespass_backend\n\n lespas_memcached:\n image : memcached:1.6\n container_name: lespas_memcached\n hostname: lespas_memcached\n restart: always\n networks:\n - lespass_backend\n\n lespas_redis:\n container_name: lespas_redis\n hostname: lespas_redis\n image: redis:7.2.3-bookworm\n restart: unless-stopped\n networks:\n - lespass_backend\n\n lespass_django:\n image: tibillet/lespass:latest\n restart: unless-stopped\n container_name: lespass_django\n hostname: lespass_django\n volumes:\n - ./www:/DjangoFiles/www\n - ./logs:/DjangoFiles/logs\n - ./backup:/Backup\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n\n lespass_celery:\n image: tibillet/lespass:latest\n container_name: lespass_celery\n hostname: lespass_celery\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n command: "poetry run celery -A TiBillet worker -l INFO"\n\n\n lespass_nginx:\n image: nginx:latest\n container_name: lespass_nginx\n hostname: lespass_nginx\n links:\n - lespass_django:lespass_django\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.lespass_nginx.tls.certresolver=myresolver\n - traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)\n - traefik.http.services.lespass_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - lespass_backend\n\n\n\nnetworks:\n frontend:\n external: true\n lespass_backend:\n\n'})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules-1",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/lespass.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'server {\n\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://lespass_django:8002;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_redirect off;\n proxy_http_version 1.1;\n client_max_body_size 4M;\n proxy_buffer_size 16k;\n proxy_buffers 32 16k;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection "upgrade";\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-Host $server_name;\n }\n}\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var r=s(6540);const o={},t=r.createContext(o);function i(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[4831],{2564:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>d});var r=s(4848),o=s(8453);const t={sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},i=void 0,a={id:"install/server_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",source:"@site/i18n/fr/docusaurus-plugin-content-docs/current/install/server_install.md",sourceDirName:"install",slug:"/install/docker_install",permalink:"/fr/docs/install/docker_install",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/install/server_install.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{sidebar_position:100,slug:"docker_install",title:"Self hosted TiBillet instances",description:"self hosted TiBillet tools with docker",keywords:["cashless","billetterie","ticketing"],wiktags:["cashless","billetterie","ticketing"],authors:"jonas"},sidebar:"tutorialSidebar",previous:{title:"Raspberry Box - Software",permalink:"/fr/docs/install/raspberry_soft"},next:{title:"API",permalink:"/fr/docs/category/api"}},l={},d=[{value:"Legal warning",id:"legal-warning",level:2},{value:"Introduction to Engines",id:"introduction-to-engines",level:2},{value:"Generate many Fernet key and django secret key",id:"generate-many-fernet-key-and-django-secret-key",level:3},{value:"Fedow : One ring to rule them all",id:"fedow--one-ring-to-rule-them-all",level:2},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable",level:3},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch",level:3},{value:"Nginx rules",id:"nginx-rules",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file",level:3},{value:"Launch the rocket !",id:"launch-the-rocket-",level:3},{value:"Backup",id:"backup",level:3},{value:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill.",id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",level:2},{value:"Prepare the rocket launch",id:"prepare-the-rocket-launch-1",level:3},{value:"Create .env file and fill it with your own variable",id:"create-env-file-and-fill-it-with-your-own-variable-1",level:3},{value:"Nginx rules",id:"nginx-rules-1",level:3},{value:"The docker-compose.yml file",id:"the-docker-composeyml-file-1",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"legal-warning",children:"Legal warning"}),"\n",(0,r.jsxs)(n.admonition,{type:"danger",children:[(0,r.jsxs)(n.p,{children:["Since January 1, 2018, in order to combat VAT fraud, all VAT-registered professionals recording\ncustomer payments using one of these software or systems are required to use secure, ",(0,r.jsx)(n.strong,{children:"certified hardware"}),"."]}),(0,r.jsxs)(n.p,{children:["A measure enshrined in\n",(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"Article 286 3\xb0 bis of the General Tax Code"}),"\nand initially stemming from the 2016 Finance Act,\nwhen ",(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"April"}),"\nbecame involved in promoting and defending open-source\nsoftware with cashiering functions."]}),(0,r.jsxs)(n.p,{children:["If you're using ",(0,r.jsx)(n.a,{href:"/docs/presentation/tarifs",children:"TiBillet's Coop' and SaaS model"}),", you don't need to worry about any of\nthis : We provide you with the certificate."]}),(0,r.jsx)(n.p,{children:"But if you self-host your own cash register instance, you legally become the publisher, and we can't provide you with\nany legal documents to present to the tax authorities."}),(0,r.jsx)(n.p,{children:"I imagine that if you're here, it's to install it yourself ;)"}),(0,r.jsx)(n.p,{children:"Here you are informed!"})]}),"\n",(0,r.jsx)(n.p,{children:"More information here (in french) :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse",children:"https://www.economie.gouv.fr/entreprises/professionnels-logiciels-caisse"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc",children:"https://www.april.org/reglementation-des-systemes-de-caisse-les-logiciels-libres-de-mieux-en-mieux-pris-en-compte-par-berc"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666",children:"https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042914666"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"introduction-to-engines",children:"Introduction to Engines"}),"\n",(0,r.jsx)(n.p,{children:"Tibillet is a software suite composed of several interoperable building blocks. The engines are :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Fedow",children:"Fedow"}),": Federated and open wallet, the federation engine. A PoA and Rsa key based\nblockchain to\nshare membership assets, local currencies and\ntime for several Lespass and LaBoutik instances."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/Lespass",children:"Lespass"}),": Ticketing, booking, membership and landing page engines. Usefull too\nfor refill online with self scanned qrcode unique on each card."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/TiBillet/LaBoutik",children:"LaBoutik"}),": Cash register, cashless system with RFID / NFC chip and order-taking\nsystem."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"To get the full functionality of TiBillet, you need to install these three engines."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Fedow"})," for multiple locations (RSA based PoA blockchain)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Lespass"})," for multiple locations (Django multi-tenant)"]}),"\n",(0,r.jsxs)(n.li,{children:["One ",(0,r.jsx)(n.strong,{children:"Laboutik"})," per location, which connects to a fedow and a lespass to join a federation."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{title:"Exemple",type:"note",children:(0,r.jsxs)(n.p,{children:["if you want to use the same NFC card to manage cashless at 2 festivals and 3 community caf\xe9s, you'll need 5\n",(0,r.jsx)(n.strong,{children:"LabouTik"}),", but only one ",(0,r.jsx)(n.strong,{children:"Fedow"})," for the federated asset, and one ",(0,r.jsx)(n.strong,{children:"Lespass"})," for the webpage of each venue.\nThe same applies if you want to manage a co-working subscription for a\ngroup of ",(0,r.jsx)(n.em,{children:"third place"})," in a given city/region/department."]})}),"\n",(0,r.jsx)(n.h1,{id:"requirements-",children:"Requirements :"}),"\n",(0,r.jsxs)(n.p,{children:["For security and performance reasons, we recommend that you separate the ",(0,r.jsx)(n.strong,{children:"Lespass"})," public area from the ",(0,r.jsx)(n.strong,{children:"LaBoutik"}),"\ncheckout and ",(0,r.jsx)(n.strong,{children:"Fedow"})," federation engines."]}),"\n",(0,r.jsx)(n.p,{children:"For dev' and test purpose, you can install everything on one VPS. Here the minimal requirements :"}),"\n",(0,r.jsx)(n.p,{children:"A linux server with :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"2 vCpu / 4Go Ram"}),"\n",(0,r.jsx)(n.li,{children:"Docker & Compose"}),"\n",(0,r.jsx)(n.li,{children:"1 domain with wildcard capacity"}),"\n",(0,r.jsx)(n.li,{children:"A Reverse proxy who handle 443 and 80 port (we use Traefik)"}),"\n",(0,r.jsxs)(n.li,{children:["A valid Stripe account with ",(0,r.jsx)(n.em,{children:"Stripe connect"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can find some ressource (in french) here :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part1"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If you're ready for adventure, create a new folder \"TiBillet\", and let's start by installing a Fedow!"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet && cd TiBillet\n"})}),"\n",(0,r.jsx)(n.h3,{id:"generate-many-fernet-key-and-django-secret-key",children:"Generate many Fernet key and django secret key"}),"\n",(0,r.jsx)(n.p,{children:"You will need 3 couple of Fernet/Django secret key."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Generate fernet key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from cryptography.fernet import Fernet; print('\\n'.join([Fernet.generate_key().decode('utf-8') for i in range(0,30)]))\"\n\n# Generate django secret key with the fedow image :\n# Choose one line and fill the .env file\ndocker run --rm tibillet/fedow:alpha1.2 poetry run python3 -c \"from django.core.management.utils import get_random_secret_key; print('\\n'.join([get_random_secret_key() for i in range(0,30)]))\"\n"})}),"\n",(0,r.jsx)(n.h2,{id:"fedow--one-ring-to-rule-them-all",children:"Fedow : One ring to rule them all"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Fedow && cd TiBillet/Fedow\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create .env and fill with :\nSECRET_KEY='' # see upper to create one\nFERNET_KEY='' # see upper to create one\nDOMAIN='' # ex : fedow.domain.com\nSTRIPE_KEY='' # from your stripe account\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Create frontend and backend network with docker\ndocker network create frontend\ndocker network create fedow_backend\n\n# prepare the logs, assets, database and nginx conf folder\nmkdir logs www database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/django.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"server {\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://fedow_django:8000;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header Host $host;\n proxy_redirect off;\n }\n}\n"})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"services:\n fedow_memcached:\n image: memcached:1.6\n container_name: fedow_memcached\n hostname: fedow_memcached\n restart: always\n networks:\n - fedow_backend\n \n fedow_django:\n image: tibillet/fedow:latest\n container_name: fedow_django\n hostname: fedow_django\n restart: always\n env_file: .env\n user: fedow\n volumes:\n - ./database:/home/fedow/Fedow/database\n - ./www:/home/fedow/Fedow/www\n - ./logs:/home/fedow/Fedow/logs\n links:\n - fedow_memcached:memcached\n networks:\n - fedow_backend\n\n fedow_nginx:\n image: nginx:latest\n restart: always\n container_name: fedow_nginx\n hostname: fedow_nginx\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n depends_on:\n - fedow_django\n links:\n - fedow_django:fedow_django\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.fedow_nginx.tls.certresolver=myresolver\n - traefik.http.routers.fedow_nginx.rule=Host(`$DOMAIN`)\n - traefik.http.services.fedow_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - fedow_backend\n\n\nnetworks:\n frontend:\n external: true\n fedow_backend:\n"})}),"\n",(0,r.jsx)(n.h3,{id:"launch-the-rocket-",children:"Launch the rocket !"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d \n# To see the logs :\ndocker compose logs -f \n"})}),"\n",(0,r.jsxs)(n.p,{children:["And check to ",(0,r.jsx)(n.code,{children:"https:///dashboard"})]}),"\n",(0,r.jsx)(n.p,{children:"Congratulation, You own your blockchain ;)"}),"\n",(0,r.jsx)(n.h3,{id:"backup",children:"Backup"}),"\n",(0,r.jsx)(n.p,{children:"To make a backup, simply back up the database folder regularly."}),"\n",(0,r.jsx)(n.h2,{id:"lespass--multi-tenant-engine-for-membership-ticketing-and-online-cashless-refill",children:"Lespass : Multi tenant engine for membership, ticketing and online cashless refill."}),"\n",(0,r.jsxs)(n.p,{children:["Lespass is a multi-tenant engine. It is designed to work with a traefik and a wildcard certificate. See\nthe ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/",children:"Code Commun blog"})," for\nexemple : ",(0,r.jsx)(n.a,{href:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2",children:"https://codecommun.coop/blog/sysadmin-mon-chaton-part2"})]}),"\n",(0,r.jsx)(n.p,{children:"For a test and development environment, it can be run on the same environment as Fedow :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir TiBillet/Lespass && cd TiBillet/Lespass\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prepare-the-rocket-launch-1",children:"Prepare the rocket launch"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# prepare the logs, assets, backup and database folder\nmkdir logs www backup database nginx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"create-env-file-and-fill-it-with-your-own-variable-1",children:"Create .env file and fill it with your own variable"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Secret\nDJANGO_SECRET='' # see upper to create one\nFERNET_KEY='' # see upper to create one\n\nSTRIPE_KEY='' # from your stripe account\n# or \nSTRIPE_KEY_TEST=''\nSTRIPE_TEST=0 # set to 1 for use stripe test env\n\n# Database\nPOSTGRES_HOST='lespass_postgres'\nPOSTGRES_USER='lespass_postgres_user'\nPOSTGRES_PASSWORD='' # strong ! generate a new fernet for exemple.\nPOSTGRES_DB='lespass'\n\nTIME_ZONE='Europe/Paris' # or where you are\nPUBLIC='TiBillet Coop.' # The name of the root instance\n\nFEDOW_DOMAIN='' # the same as Fedow\n\nDOMAIN='' # for the wildcard : without subdomain ! ex : tibillet.coop, not lespass.tibillet.coop\nSUB='' # the sub domain of your first place ex : if 'festival', it will be accessible on https://festival.tibillet.coop\nMETA='' # the federated agenda for all events on all tenants. If 'agenda', it will be accessible, for exemple, on https://agenda.tibillet.coop\n\n# For transactionnal email : \nEMAIL_HOST=''\nEMAIL_PORT=''\nEMAIL_HOST_USER=''\nEMAIL_HOST_PASSWORD=''\n\n# Change only if needed :\nCELERY_BROKER='redis://redis:6379/0'\nCELERY_BACKEND='redis://redis:6379/0'\n"})}),"\n",(0,r.jsx)(n.h3,{id:"nginx-rules-1",children:"Nginx rules"}),"\n",(0,r.jsxs)(n.p,{children:["Cr\xe9ate the file with ",(0,r.jsx)(n.code,{children:"nano nginx/lespass.conf"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'server {\n\n listen 80;\n server_name localhost;\n\n access_log /logs/nginxAccess.log;\n error_log /logs/nginxError.log;\n\n location /static {\n root /www;\n }\n\n location /media {\n root /www;\n }\n\n location / {\n # everything is passed to Gunicorn\n proxy_pass http://lespass_django:8002;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_redirect off;\n proxy_http_version 1.1;\n client_max_body_size 4M;\n proxy_buffer_size 16k;\n proxy_buffers 32 16k;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection "upgrade";\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-Host $server_name;\n }\n}\n\n'})}),"\n",(0,r.jsxs)(n.h3,{id:"the-docker-composeyml-file-1",children:["The ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'services:\n lespass_postgres:\n image: postgres:13-bookworm\n restart: unless-stopped\n container_name: lespass_postgres\n hostname: lespass_postgres\n volumes:\n - ./database/data:/var/lib/postgresql/data\n env_file: .env\n networks:\n - lespass_backend\n\n lespas_memcached:\n image : memcached:1.6\n container_name: lespas_memcached\n hostname: lespas_memcached\n restart: always\n networks:\n - lespass_backend\n\n lespas_redis:\n container_name: lespas_redis\n hostname: lespas_redis\n image: redis:7.2.3-bookworm\n restart: unless-stopped\n networks:\n - lespass_backend\n\n lespass_django:\n image: tibillet/lespass:latest\n restart: unless-stopped\n container_name: lespass_django\n hostname: lespass_django\n volumes:\n - ./www:/DjangoFiles/www\n - ./logs:/DjangoFiles/logs\n - ./backup:/Backup\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n\n lespass_celery:\n image: tibillet/lespass:latest\n container_name: lespass_celery\n hostname: lespass_celery\n env_file: .env\n depends_on:\n - lespass_postgres\n - lespas_redis\n links:\n - lespass_postgres:postgres\n - lespas_redis:redis\n - lespas_memcached:memcached\n networks:\n - lespass_backend\n# command: "sleep infinity"\n command: "poetry run celery -A TiBillet worker -l INFO"\n\n\n lespass_nginx:\n image: nginx:latest\n container_name: lespass_nginx\n hostname: lespass_nginx\n links:\n - lespass_django:lespass_django\n volumes:\n - ./www:/www\n - ./logs:/logs\n - ./nginx:/etc/nginx/conf.d\n labels:\n - traefik.enable=true\n - traefik.docker.network=frontend\n - traefik.http.routers.lespass_nginx.tls.certresolver=myresolver\n - traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)\n - traefik.http.services.lespass_nginx.loadbalancer.server.port=80\n networks:\n - frontend\n - lespass_backend\n\n\n\nnetworks:\n frontend:\n external: true\n lespass_backend:\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var r=s(6540);const o={},t=r.createContext(o);function i(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/fr/assets/js/runtime~main.e1f3c192.js b/fr/assets/js/runtime~main.714a8c2b.js similarity index 99% rename from fr/assets/js/runtime~main.e1f3c192.js rename to fr/assets/js/runtime~main.714a8c2b.js index 822af4bf..f284e78c 100644 --- a/fr/assets/js/runtime~main.e1f3c192.js +++ b/fr/assets/js/runtime~main.714a8c2b.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,b,c,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return d[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=d,r.c=t,e=[],r.O=(a,f,b,c)=>{if(!f){var d=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,b,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&b&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(c,d),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({18:"5e0c5061",41:"ce45a5f7",311:"6478c5d7",900:"c060da0a",1051:"b48fe3d4",1171:"3039c417",1178:"270a7541",1339:"72c1897c",1881:"154a1c34",2047:"583c92f6",2216:"b85a8061",2387:"0c7e5857",2431:"8e6f8c28",2469:"1ed72f18",2491:"980f6704",2553:"2fef3c2c",2644:"68e5a7f1",2977:"3da3203d",3064:"55afe7bb",3111:"32a423af",3471:"9bcede35",3480:"474b1dc0",3628:"696d41fa",3736:"90248b2b",3898:"d51fbebd",4279:"df203c0f",4300:"acef3f09",4754:"5f17d2c3",4787:"3720c009",4806:"8f0ce7bf",4831:"a4a43940",4967:"2ba7bea0",5053:"e462b8cb",5139:"931e362c",5151:"55960ee5",5179:"c2be3d09",5264:"bb7bdf28",5421:"77c71e62",5605:"258bd27d",5612:"19463738",5767:"0974cb83",5870:"1a90fa4c",5893:"a392a714",6061:"1f391b9e",6307:"c779de90",6364:"21f279ec",6631:"bc28e0ff",6633:"f95bfafa",6969:"14eb3368",7091:"6b9c5894",7097:"22141914",7098:"a7bd4aaa",7204:"b5eb3260",7279:"481320e5",7403:"df2a2fef",7583:"d9efc8e6",7636:"794cb0ae",7768:"9c998f21",8017:"031b3c77",8343:"63aafed8",8345:"070ddeb6",8383:"f268abb1",8401:"17896441",8561:"a65a45c1",8581:"935f2afb",8616:"f034b0c7",8619:"8a20bd45",8685:"92123155",8697:"a691281d",9048:"a94703ab",9131:"6bc29cb1",9163:"4785a6a8",9249:"f4c87bfd",9374:"5026e034",9579:"a727ba59",9647:"5e95c892",9960:"51d1b5b5"}[e]||e)+"."+{18:"884cc6ea",41:"d7a45fdb",311:"34d88a93",900:"2fc57906",1051:"39e1b2c7",1171:"4d82ed5d",1178:"34f0392a",1339:"5545ad56",1881:"67155185",2047:"fdf476c9",2216:"ce26eefd",2237:"c97ebfc9",2387:"021101cf",2431:"820330e5",2469:"54e5be83",2491:"fae964a6",2553:"f582d2a9",2644:"67648ea0",2674:"b72a0eb3",2977:"6dc5aa8a",3064:"98f5e278",3111:"f88ae612",3471:"123f771a",3480:"8cc6c9fb",3628:"835536b7",3736:"78a66852",3898:"b95bc1bf",4279:"f554e1cf",4300:"dbf1cb81",4754:"fcdbf29c",4787:"648af45f",4806:"f459e51d",4831:"019bd91f",4967:"61d91f3b",5053:"bb97391e",5139:"5d86782e",5151:"a5dcae2a",5179:"0e3855c8",5264:"fc88e47b",5421:"b0dac5eb",5605:"9f54603b",5612:"c3706f19",5767:"0ef9b2dc",5870:"efe057bc",5893:"45dc6bed",6061:"8e3b9443",6307:"30c2f367",6364:"15bd6343",6631:"88a36da9",6633:"bae4ef6f",6969:"f1620d39",7091:"98387490",7097:"cf017c7d",7098:"9907b4db",7204:"ebf2cb27",7279:"9a0fcfbf",7403:"67f28f89",7583:"124fc705",7636:"202b0177",7768:"60dcee60",8017:"f11f4ba3",8343:"f56ff0aa",8345:"c9fe79f4",8383:"c90d9d7b",8401:"34fa3bc0",8561:"c6c31a2c",8581:"9cb57a56",8616:"30d995fc",8619:"fb7f1ff2",8685:"8da9d298",8697:"74edef6b",9048:"b3e1445a",9131:"4ec29544",9163:"880b4ba3",9249:"7b3bc41f",9374:"aa903537",9579:"df8b20e3",9647:"674f41d0",9960:"9ba51f92"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},c="documentation-v-2:",r.l=(e,a,f,d)=>{if(b[e])b[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/fr/",r.gca=function(e){return e={17896441:"8401",19463738:"5612",22141914:"7097",92123155:"8685","5e0c5061":"18",ce45a5f7:"41","6478c5d7":"311",c060da0a:"900",b48fe3d4:"1051","3039c417":"1171","270a7541":"1178","72c1897c":"1339","154a1c34":"1881","583c92f6":"2047",b85a8061:"2216","0c7e5857":"2387","8e6f8c28":"2431","1ed72f18":"2469","980f6704":"2491","2fef3c2c":"2553","68e5a7f1":"2644","3da3203d":"2977","55afe7bb":"3064","32a423af":"3111","9bcede35":"3471","474b1dc0":"3480","696d41fa":"3628","90248b2b":"3736",d51fbebd:"3898",df203c0f:"4279",acef3f09:"4300","5f17d2c3":"4754","3720c009":"4787","8f0ce7bf":"4806",a4a43940:"4831","2ba7bea0":"4967",e462b8cb:"5053","931e362c":"5139","55960ee5":"5151",c2be3d09:"5179",bb7bdf28:"5264","77c71e62":"5421","258bd27d":"5605","0974cb83":"5767","1a90fa4c":"5870",a392a714:"5893","1f391b9e":"6061",c779de90:"6307","21f279ec":"6364",bc28e0ff:"6631",f95bfafa:"6633","14eb3368":"6969","6b9c5894":"7091",a7bd4aaa:"7098",b5eb3260:"7204","481320e5":"7279",df2a2fef:"7403",d9efc8e6:"7583","794cb0ae":"7636","9c998f21":"7768","031b3c77":"8017","63aafed8":"8343","070ddeb6":"8345",f268abb1:"8383",a65a45c1:"8561","935f2afb":"8581",f034b0c7:"8616","8a20bd45":"8619",a691281d:"8697",a94703ab:"9048","6bc29cb1":"9131","4785a6a8":"9163",f4c87bfd:"9249","5026e034":"9374",a727ba59:"9579","5e95c892":"9647","51d1b5b5":"9960"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,f)=>{var b=r.o(e,a)?e[a]:void 0;if(0!==b)if(b)f.push(b[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>b=e[a]=[f,c]));f.push(b[2]=c);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var c=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+d+")",t.name="ChunkLoadError",t.type=c,t.request=d,b[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var b,c,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,b,c,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return d[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=d,r.c=t,e=[],r.O=(a,f,b,c)=>{if(!f){var d=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,b,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&b&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(c,d),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({18:"5e0c5061",41:"ce45a5f7",311:"6478c5d7",900:"c060da0a",1051:"b48fe3d4",1171:"3039c417",1178:"270a7541",1339:"72c1897c",1881:"154a1c34",2047:"583c92f6",2216:"b85a8061",2387:"0c7e5857",2431:"8e6f8c28",2469:"1ed72f18",2491:"980f6704",2553:"2fef3c2c",2644:"68e5a7f1",2977:"3da3203d",3064:"55afe7bb",3111:"32a423af",3471:"9bcede35",3480:"474b1dc0",3628:"696d41fa",3736:"90248b2b",3898:"d51fbebd",4279:"df203c0f",4300:"acef3f09",4754:"5f17d2c3",4787:"3720c009",4806:"8f0ce7bf",4831:"a4a43940",4967:"2ba7bea0",5053:"e462b8cb",5139:"931e362c",5151:"55960ee5",5179:"c2be3d09",5264:"bb7bdf28",5421:"77c71e62",5605:"258bd27d",5612:"19463738",5767:"0974cb83",5870:"1a90fa4c",5893:"a392a714",6061:"1f391b9e",6307:"c779de90",6364:"21f279ec",6631:"bc28e0ff",6633:"f95bfafa",6969:"14eb3368",7091:"6b9c5894",7097:"22141914",7098:"a7bd4aaa",7204:"b5eb3260",7279:"481320e5",7403:"df2a2fef",7583:"d9efc8e6",7636:"794cb0ae",7768:"9c998f21",8017:"031b3c77",8343:"63aafed8",8345:"070ddeb6",8383:"f268abb1",8401:"17896441",8561:"a65a45c1",8581:"935f2afb",8616:"f034b0c7",8619:"8a20bd45",8685:"92123155",8697:"a691281d",9048:"a94703ab",9131:"6bc29cb1",9163:"4785a6a8",9249:"f4c87bfd",9374:"5026e034",9579:"a727ba59",9647:"5e95c892",9960:"51d1b5b5"}[e]||e)+"."+{18:"884cc6ea",41:"d7a45fdb",311:"34d88a93",900:"2fc57906",1051:"39e1b2c7",1171:"4d82ed5d",1178:"34f0392a",1339:"5545ad56",1881:"67155185",2047:"fdf476c9",2216:"ce26eefd",2237:"c97ebfc9",2387:"021101cf",2431:"820330e5",2469:"54e5be83",2491:"fae964a6",2553:"f582d2a9",2644:"67648ea0",2674:"b72a0eb3",2977:"6dc5aa8a",3064:"98f5e278",3111:"f88ae612",3471:"123f771a",3480:"8cc6c9fb",3628:"835536b7",3736:"78a66852",3898:"b95bc1bf",4279:"f554e1cf",4300:"dbf1cb81",4754:"fcdbf29c",4787:"648af45f",4806:"f459e51d",4831:"1eec1011",4967:"61d91f3b",5053:"bb97391e",5139:"5d86782e",5151:"a5dcae2a",5179:"0e3855c8",5264:"fc88e47b",5421:"b0dac5eb",5605:"9f54603b",5612:"c3706f19",5767:"0ef9b2dc",5870:"efe057bc",5893:"45dc6bed",6061:"8e3b9443",6307:"30c2f367",6364:"15bd6343",6631:"88a36da9",6633:"bae4ef6f",6969:"f1620d39",7091:"98387490",7097:"cf017c7d",7098:"9907b4db",7204:"ebf2cb27",7279:"9a0fcfbf",7403:"67f28f89",7583:"124fc705",7636:"202b0177",7768:"60dcee60",8017:"f11f4ba3",8343:"f56ff0aa",8345:"c9fe79f4",8383:"c90d9d7b",8401:"34fa3bc0",8561:"c6c31a2c",8581:"9cb57a56",8616:"30d995fc",8619:"fb7f1ff2",8685:"8da9d298",8697:"74edef6b",9048:"b3e1445a",9131:"4ec29544",9163:"880b4ba3",9249:"7b3bc41f",9374:"aa903537",9579:"df8b20e3",9647:"674f41d0",9960:"9ba51f92"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},c="documentation-v-2:",r.l=(e,a,f,d)=>{if(b[e])b[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/fr/",r.gca=function(e){return e={17896441:"8401",19463738:"5612",22141914:"7097",92123155:"8685","5e0c5061":"18",ce45a5f7:"41","6478c5d7":"311",c060da0a:"900",b48fe3d4:"1051","3039c417":"1171","270a7541":"1178","72c1897c":"1339","154a1c34":"1881","583c92f6":"2047",b85a8061:"2216","0c7e5857":"2387","8e6f8c28":"2431","1ed72f18":"2469","980f6704":"2491","2fef3c2c":"2553","68e5a7f1":"2644","3da3203d":"2977","55afe7bb":"3064","32a423af":"3111","9bcede35":"3471","474b1dc0":"3480","696d41fa":"3628","90248b2b":"3736",d51fbebd:"3898",df203c0f:"4279",acef3f09:"4300","5f17d2c3":"4754","3720c009":"4787","8f0ce7bf":"4806",a4a43940:"4831","2ba7bea0":"4967",e462b8cb:"5053","931e362c":"5139","55960ee5":"5151",c2be3d09:"5179",bb7bdf28:"5264","77c71e62":"5421","258bd27d":"5605","0974cb83":"5767","1a90fa4c":"5870",a392a714:"5893","1f391b9e":"6061",c779de90:"6307","21f279ec":"6364",bc28e0ff:"6631",f95bfafa:"6633","14eb3368":"6969","6b9c5894":"7091",a7bd4aaa:"7098",b5eb3260:"7204","481320e5":"7279",df2a2fef:"7403",d9efc8e6:"7583","794cb0ae":"7636","9c998f21":"7768","031b3c77":"8017","63aafed8":"8343","070ddeb6":"8345",f268abb1:"8383",a65a45c1:"8561","935f2afb":"8581",f034b0c7:"8616","8a20bd45":"8619",a691281d:"8697",a94703ab:"9048","6bc29cb1":"9131","4785a6a8":"9163",f4c87bfd:"9249","5026e034":"9374",a727ba59:"9579","5e95c892":"9647","51d1b5b5":"9960"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,f)=>{var b=r.o(e,a)?e[a]:void 0;if(0!==b)if(b)f.push(b[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>b=e[a]=[f,c]));f.push(b[2]=c);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var c=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+d+")",t.name="ChunkLoadError",t.type=c,t.request=d,b[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var b,c,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(a&&a(f);n Conditions générales de vente et d'utilisation | TiBillet - + diff --git a/fr/docs/Tips/facebook/index.html b/fr/docs/Tips/facebook/index.html index 78137478..a71bf30a 100644 --- a/fr/docs/Tips/facebook/index.html +++ b/fr/docs/Tips/facebook/index.html @@ -4,7 +4,7 @@ Publication sur les réseaux sociaux | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html b/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html index fb29d351..0e411a1b 100644 --- a/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html +++ b/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html @@ -4,7 +4,7 @@ Créer un nouvel évènement de A à Z | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html b/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html index 414128b5..ef04dc85 100644 --- a/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html +++ b/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html @@ -4,7 +4,7 @@ Créer un évènement gratuit | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/iframe/index.html b/fr/docs/Utilisateur/Billetterie/iframe/index.html index 8e608ec7..b5763a02 100644 --- a/fr/docs/Utilisateur/Billetterie/iframe/index.html +++ b/fr/docs/Utilisateur/Billetterie/iframe/index.html @@ -4,7 +4,7 @@ Intégration | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/rss/index.html b/fr/docs/Utilisateur/Billetterie/rss/index.html index 0f51698c..7c30dc34 100644 --- a/fr/docs/Utilisateur/Billetterie/rss/index.html +++ b/fr/docs/Utilisateur/Billetterie/rss/index.html @@ -4,7 +4,7 @@ Flux RSS | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/webhook/index.html b/fr/docs/Utilisateur/Billetterie/webhook/index.html index e9be8553..1c76d443 100644 --- a/fr/docs/Utilisateur/Billetterie/webhook/index.html +++ b/fr/docs/Utilisateur/Billetterie/webhook/index.html @@ -4,7 +4,7 @@ Webhook | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_article/index.html b/fr/docs/Utilisateur/Cashless/admin_add_article/index.html index 418b9657..45907445 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_article/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_article/index.html @@ -4,7 +4,7 @@ Articles | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html b/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html index 8a1fc37e..6da2ddc5 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html @@ -4,7 +4,7 @@ Catégories d'articles | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html b/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html index eb82d80a..9229afcc 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html @@ -4,7 +4,7 @@ Points de vente | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html b/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html index 36c6058c..f8ea7069 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html @@ -4,7 +4,7 @@ Cartes Primaires | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_supp/index.html b/fr/docs/Utilisateur/Cashless/admin_supp/index.html index 292aa259..165aee32 100644 --- a/fr/docs/Utilisateur/Cashless/admin_supp/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_supp/index.html @@ -4,7 +4,7 @@ Suppression des commandes | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/android/index.html b/fr/docs/Utilisateur/Cashless/android/index.html index 20be571e..ce648437 100644 --- a/fr/docs/Utilisateur/Cashless/android/index.html +++ b/fr/docs/Utilisateur/Cashless/android/index.html @@ -4,7 +4,7 @@ Application Android | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/badge/index.html b/fr/docs/Utilisateur/Cashless/badge/index.html index 2298458e..82d3632f 100644 --- a/fr/docs/Utilisateur/Cashless/badge/index.html +++ b/fr/docs/Utilisateur/Cashless/badge/index.html @@ -4,7 +4,7 @@ Badgeuse | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/cashback/index.html b/fr/docs/Utilisateur/Cashless/cashback/index.html index 5819a269..f8cabf13 100644 --- a/fr/docs/Utilisateur/Cashless/cashback/index.html +++ b/fr/docs/Utilisateur/Cashless/cashback/index.html @@ -4,7 +4,7 @@ Cashback | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/fedelity/index.html b/fr/docs/Utilisateur/Cashless/fedelity/index.html index 32f7bc13..d2bcbb84 100644 --- a/fr/docs/Utilisateur/Cashless/fedelity/index.html +++ b/fr/docs/Utilisateur/Cashless/fedelity/index.html @@ -4,7 +4,7 @@ Points de fidélités | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/impression_preparation/index.html b/fr/docs/Utilisateur/Cashless/impression_preparation/index.html index 1394feb4..1efd9369 100644 --- a/fr/docs/Utilisateur/Cashless/impression_preparation/index.html +++ b/fr/docs/Utilisateur/Cashless/impression_preparation/index.html @@ -4,7 +4,7 @@ Impression des commandes | TiBillet - + diff --git a/fr/docs/api/apikey/index.html b/fr/docs/api/apikey/index.html index 2c0f3b82..358241c0 100644 --- a/fr/docs/api/apikey/index.html +++ b/fr/docs/api/apikey/index.html @@ -4,7 +4,7 @@ API Keys | TiBillet - + diff --git a/fr/docs/api/events/index.html b/fr/docs/api/events/index.html index f28d1437..c5799ed5 100644 --- a/fr/docs/api/events/index.html +++ b/fr/docs/api/events/index.html @@ -4,7 +4,7 @@ Évènements | TiBillet - + diff --git a/fr/docs/api/intro/index.html b/fr/docs/api/intro/index.html index eaae61ca..51fa23d5 100644 --- a/fr/docs/api/intro/index.html +++ b/fr/docs/api/intro/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/fr/docs/api/products/index.html b/fr/docs/api/products/index.html index 3179dace..9d716e53 100644 --- a/fr/docs/api/products/index.html +++ b/fr/docs/api/products/index.html @@ -4,7 +4,7 @@ Produits | TiBillet - + diff --git a/fr/docs/api/reservations/index.html b/fr/docs/api/reservations/index.html index 158f1c61..a435eeda 100644 --- a/fr/docs/api/reservations/index.html +++ b/fr/docs/api/reservations/index.html @@ -4,7 +4,7 @@ Réservations et billets | TiBillet - + diff --git a/fr/docs/api/tenants/index.html b/fr/docs/api/tenants/index.html index e7d8c72e..555ac485 100644 --- a/fr/docs/api/tenants/index.html +++ b/fr/docs/api/tenants/index.html @@ -4,7 +4,7 @@ Tenants | TiBillet - + diff --git a/fr/docs/category/api/index.html b/fr/docs/category/api/index.html index b62cefe5..198dd9f0 100644 --- a/fr/docs/category/api/index.html +++ b/fr/docs/category/api/index.html @@ -4,7 +4,7 @@ API | TiBillet - + diff --git a/fr/docs/category/billetterie/index.html b/fr/docs/category/billetterie/index.html index d74b86c9..acb0b69b 100644 --- a/fr/docs/category/billetterie/index.html +++ b/fr/docs/category/billetterie/index.html @@ -4,7 +4,7 @@ Billetterie | TiBillet - + diff --git a/fr/docs/category/cashless/index.html b/fr/docs/category/cashless/index.html index 366942ff..e27d7bba 100644 --- a/fr/docs/category/cashless/index.html +++ b/fr/docs/category/cashless/index.html @@ -4,7 +4,7 @@ Cashless | TiBillet - + diff --git a/fr/docs/category/diy/index.html b/fr/docs/category/diy/index.html index 384ba522..b762f041 100644 --- a/fr/docs/category/diy/index.html +++ b/fr/docs/category/diy/index.html @@ -4,7 +4,7 @@ DIY | TiBillet - + diff --git a/fr/docs/category/documentation-utilisateur/index.html b/fr/docs/category/documentation-utilisateur/index.html index 9c20deae..a874969e 100644 --- a/fr/docs/category/documentation-utilisateur/index.html +++ b/fr/docs/category/documentation-utilisateur/index.html @@ -4,7 +4,7 @@ Documentation utilisateur | TiBillet - + diff --git "a/fr/docs/category/pr\303\251sentation/index.html" "b/fr/docs/category/pr\303\251sentation/index.html" index 27982424..78694cad 100644 --- "a/fr/docs/category/pr\303\251sentation/index.html" +++ "b/fr/docs/category/pr\303\251sentation/index.html" @@ -4,7 +4,7 @@ Présentation | TiBillet - + diff --git a/fr/docs/category/trucs-et-astuces/index.html b/fr/docs/category/trucs-et-astuces/index.html index 64d1c903..6ab0e066 100644 --- a/fr/docs/category/trucs-et-astuces/index.html +++ b/fr/docs/category/trucs-et-astuces/index.html @@ -4,7 +4,7 @@ Trucs et astuces | TiBillet - + diff --git a/fr/docs/install/docker_install/index.html b/fr/docs/install/docker_install/index.html index 89a95190..e6885c0a 100644 --- a/fr/docs/install/docker_install/index.html +++ b/fr/docs/install/docker_install/index.html @@ -4,7 +4,7 @@ Self hosted TiBillet instances | TiBillet - + @@ -101,10 +101,10 @@

# prepare the logs, assets, backup and database folder
mkdir logs www backup database nginx

Create .env file and fill it with your own variable

# Secret
DJANGO_SECRET='' # see upper to create one
FERNET_KEY='' # see upper to create one

STRIPE_KEY='' # from your stripe account
# or
STRIPE_KEY_TEST=''
STRIPE_TEST=0 # set to 1 for use stripe test env

# Database
POSTGRES_HOST='lespass_postgres'
POSTGRES_USER='lespass_postgres_user'
POSTGRES_PASSWORD='' # strong ! generate a new fernet for exemple.
POSTGRES_DB='lespass'

TIME_ZONE='Europe/Paris' # or where you are
PUBLIC='TiBillet Coop.' # The name of the root instance

FEDOW_DOMAIN='' # the same as Fedow

DOMAIN='' # for the wildcard : without subdomain ! ex : tibillet.coop, not lespass.tibillet.coop
SUB='' # the sub domain of your first place ex : if 'festival', it will be accessible on https://festival.tibillet.coop
META='' # the federated agenda for all events on all tenants. If 'agenda', it will be accessible, for exemple, on https://agenda.tibillet.coop

# For transactionnal email :
EMAIL_HOST=''
EMAIL_PORT=''
EMAIL_HOST_USER=''
EMAIL_HOST_PASSWORD=''

# Change only if needed :
CELERY_BROKER='redis://redis:6379/0'
CELERY_BACKEND='redis://redis:6379/0'
-

The docker-compose.yml file

-
services:
lespass_postgres:
image: postgres:13-bookworm
restart: unless-stopped
container_name: lespass_postgres
hostname: lespass_postgres
volumes:
- ./database/data:/var/lib/postgresql/data
env_file: .env
networks:
- lespass_backend

lespas_memcached:
image : memcached:1.6
container_name: lespas_memcached
hostname: lespas_memcached
restart: always
networks:
- lespass_backend

lespas_redis:
container_name: lespas_redis
hostname: lespas_redis
image: redis:7.2.3-bookworm
restart: unless-stopped
networks:
- lespass_backend

lespass_django:
image: tibillet/lespass:latest
restart: unless-stopped
container_name: lespass_django
hostname: lespass_django
volumes:
- ./www:/DjangoFiles/www
- ./logs:/DjangoFiles/logs
- ./backup:/Backup
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"

lespass_celery:
image: tibillet/lespass:latest
container_name: lespass_celery
hostname: lespass_celery
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"
command: "poetry run celery -A TiBillet worker -l INFO"


lespass_nginx:
image: nginx:latest
container_name: lespass_nginx
hostname: lespass_nginx
links:
- lespass_django:lespass_django
volumes:
- ./www:/www
- ./logs:/logs
- ./nginx:/etc/nginx/conf.d
labels:
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.lespass_nginx.tls.certresolver=myresolver
- traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)
- traefik.http.services.lespass_nginx.loadbalancer.server.port=80
networks:
- frontend
- lespass_backend



networks:
frontend:
external: true
lespass_backend:

Nginx rules

Créate the file with nano nginx/lespass.conf

-
server {

listen 80;
server_name localhost;

access_log /logs/nginxAccess.log;
error_log /logs/nginxError.log;

location /static {
root /www;
}

location /media {
root /www;
}

location / {
# everything is passed to Gunicorn
proxy_pass http://lespass_django:8002;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
client_max_body_size 4M;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
}
}

+
server {

listen 80;
server_name localhost;

access_log /logs/nginxAccess.log;
error_log /logs/nginxError.log;

location /static {
root /www;
}

location /media {
root /www;
}

location / {
# everything is passed to Gunicorn
proxy_pass http://lespass_django:8002;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
client_max_body_size 4M;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
}
}

+

The docker-compose.yml file

+
services:
lespass_postgres:
image: postgres:13-bookworm
restart: unless-stopped
container_name: lespass_postgres
hostname: lespass_postgres
volumes:
- ./database/data:/var/lib/postgresql/data
env_file: .env
networks:
- lespass_backend

lespas_memcached:
image : memcached:1.6
container_name: lespas_memcached
hostname: lespas_memcached
restart: always
networks:
- lespass_backend

lespas_redis:
container_name: lespas_redis
hostname: lespas_redis
image: redis:7.2.3-bookworm
restart: unless-stopped
networks:
- lespass_backend

lespass_django:
image: tibillet/lespass:latest
restart: unless-stopped
container_name: lespass_django
hostname: lespass_django
volumes:
- ./www:/DjangoFiles/www
- ./logs:/DjangoFiles/logs
- ./backup:/Backup
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"

lespass_celery:
image: tibillet/lespass:latest
container_name: lespass_celery
hostname: lespass_celery
env_file: .env
depends_on:
- lespass_postgres
- lespas_redis
links:
- lespass_postgres:postgres
- lespas_redis:redis
- lespas_memcached:memcached
networks:
- lespass_backend
# command: "sleep infinity"
command: "poetry run celery -A TiBillet worker -l INFO"


lespass_nginx:
image: nginx:latest
container_name: lespass_nginx
hostname: lespass_nginx
links:
- lespass_django:lespass_django
volumes:
- ./www:/www
- ./logs:/logs
- ./nginx:/etc/nginx/conf.d
labels:
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.lespass_nginx.tls.certresolver=myresolver
- traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`$META.$DOMAIN`) || Host(`$SUB.$DOMAIN`)
- traefik.http.services.lespass_nginx.loadbalancer.server.port=80
networks:
- frontend
- lespass_backend



networks:
frontend:
external: true
lespass_backend:

\ No newline at end of file diff --git a/fr/docs/install/raspberry/index.html b/fr/docs/install/raspberry/index.html index 06318b94..7c1d727c 100644 --- a/fr/docs/install/raspberry/index.html +++ b/fr/docs/install/raspberry/index.html @@ -4,7 +4,7 @@ Raspberry Box - Hardware | TiBillet - + diff --git a/fr/docs/install/raspberry_soft/index.html b/fr/docs/install/raspberry_soft/index.html index 31139bca..7cd17e5f 100644 --- a/fr/docs/install/raspberry_soft/index.html +++ b/fr/docs/install/raspberry_soft/index.html @@ -4,7 +4,7 @@ Raspberry Box - Software | TiBillet - + diff --git a/fr/docs/presentation/demonstration/index.html b/fr/docs/presentation/demonstration/index.html index ea110e1c..029a26c7 100644 --- a/fr/docs/presentation/demonstration/index.html +++ b/fr/docs/presentation/demonstration/index.html @@ -4,7 +4,7 @@ Démonstration | TiBillet - + diff --git a/fr/docs/presentation/introduction/index.html b/fr/docs/presentation/introduction/index.html index 8b983ba6..b0ed8e0a 100644 --- a/fr/docs/presentation/introduction/index.html +++ b/fr/docs/presentation/introduction/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/fr/docs/presentation/logos/index.html b/fr/docs/presentation/logos/index.html index f6099b49..89d8ce11 100644 --- a/fr/docs/presentation/logos/index.html +++ b/fr/docs/presentation/logos/index.html @@ -4,7 +4,7 @@ Logos | TiBillet - + diff --git a/fr/docs/presentation/philosophie/index.html b/fr/docs/presentation/philosophie/index.html index caf5ecd5..726de8c7 100644 --- a/fr/docs/presentation/philosophie/index.html +++ b/fr/docs/presentation/philosophie/index.html @@ -4,7 +4,7 @@ Philosophie | TiBillet - + diff --git a/fr/docs/presentation/tarifs/index.html b/fr/docs/presentation/tarifs/index.html index ac2af62b..be2866e7 100644 --- a/fr/docs/presentation/tarifs/index.html +++ b/fr/docs/presentation/tarifs/index.html @@ -4,7 +4,7 @@ Tarifs, conditions et licences | TiBillet - + diff --git a/fr/docs/presentation/usages/index.html b/fr/docs/presentation/usages/index.html index 5f12355b..d4a87915 100644 --- a/fr/docs/presentation/usages/index.html +++ b/fr/docs/presentation/usages/index.html @@ -4,7 +4,7 @@ Usages | TiBillet - + diff --git a/fr/docs/tags/access-card/index.html b/fr/docs/tags/access-card/index.html index a09d101c..1f2d3c90 100644 --- a/fr/docs/tags/access-card/index.html +++ b/fr/docs/tags/access-card/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "access card" | TiBillet - + diff --git a/fr/docs/tags/badge-inter-lieux/index.html b/fr/docs/tags/badge-inter-lieux/index.html index 79054fde..fb68f739 100644 --- a/fr/docs/tags/badge-inter-lieux/index.html +++ b/fr/docs/tags/badge-inter-lieux/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "badge inter-lieux" | TiBillet - + diff --git a/fr/docs/tags/badge/index.html b/fr/docs/tags/badge/index.html index 43f69df1..cda9b8b1 100644 --- a/fr/docs/tags/badge/index.html +++ b/fr/docs/tags/badge/index.html @@ -4,7 +4,7 @@ Un document tagué avec "badge" | TiBillet - + diff --git a/fr/docs/tags/badgeuse/index.html b/fr/docs/tags/badgeuse/index.html index 16e2983e..043b5dca 100644 --- a/fr/docs/tags/badgeuse/index.html +++ b/fr/docs/tags/badgeuse/index.html @@ -4,7 +4,7 @@ Un document tagué avec "badgeuse" | TiBillet - + diff --git a/fr/docs/tags/billetterie/index.html b/fr/docs/tags/billetterie/index.html index d83b0e9f..b509adf2 100644 --- a/fr/docs/tags/billetterie/index.html +++ b/fr/docs/tags/billetterie/index.html @@ -4,7 +4,7 @@ 5 documents tagués avec "billetterie" | TiBillet - + diff --git a/fr/docs/tags/caisse-enregistreuse/index.html b/fr/docs/tags/caisse-enregistreuse/index.html index 53ab17f5..689c96e4 100644 --- a/fr/docs/tags/caisse-enregistreuse/index.html +++ b/fr/docs/tags/caisse-enregistreuse/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "caisse enregistreuse" | TiBillet - + diff --git a/fr/docs/tags/cashback/index.html b/fr/docs/tags/cashback/index.html index 8ce3d367..2002312c 100644 --- a/fr/docs/tags/cashback/index.html +++ b/fr/docs/tags/cashback/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "cashback" | TiBillet - + diff --git a/fr/docs/tags/cashless/index.html b/fr/docs/tags/cashless/index.html index a62261c5..7d6e69b7 100644 --- a/fr/docs/tags/cashless/index.html +++ b/fr/docs/tags/cashless/index.html @@ -4,7 +4,7 @@ 5 documents tagués avec "cashless" | TiBillet - + diff --git a/fr/docs/tags/cooperative/index.html b/fr/docs/tags/cooperative/index.html index 385f4dd0..0b694e9f 100644 --- a/fr/docs/tags/cooperative/index.html +++ b/fr/docs/tags/cooperative/index.html @@ -4,7 +4,7 @@ Un document tagué avec "coopérative" | TiBillet - + diff --git a/fr/docs/tags/demonstration/index.html b/fr/docs/tags/demonstration/index.html index 1bd8f603..d6b114ff 100644 --- a/fr/docs/tags/demonstration/index.html +++ b/fr/docs/tags/demonstration/index.html @@ -4,7 +4,7 @@ Un document tagué avec "démonstration" | TiBillet - + diff --git a/fr/docs/tags/dokos/index.html b/fr/docs/tags/dokos/index.html index 0f77331d..b07b4acc 100644 --- a/fr/docs/tags/dokos/index.html +++ b/fr/docs/tags/dokos/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "dokos" | TiBillet - + diff --git a/fr/docs/tags/festival/index.html b/fr/docs/tags/festival/index.html index bcc5a6d0..ea08e532 100644 --- a/fr/docs/tags/festival/index.html +++ b/fr/docs/tags/festival/index.html @@ -4,7 +4,7 @@ Un document tagué avec "festival" | TiBillet - + diff --git a/fr/docs/tags/fidelite/index.html b/fr/docs/tags/fidelite/index.html index a62b23d4..a7a17abb 100644 --- a/fr/docs/tags/fidelite/index.html +++ b/fr/docs/tags/fidelite/index.html @@ -4,7 +4,7 @@ Un document tagué avec "fidélité" | TiBillet - + diff --git a/fr/docs/tags/fidelity/index.html b/fr/docs/tags/fidelity/index.html index a6dd1b09..f799a28a 100644 --- a/fr/docs/tags/fidelity/index.html +++ b/fr/docs/tags/fidelity/index.html @@ -4,7 +4,7 @@ Un document tagué avec "fidelity" | TiBillet - + diff --git a/fr/docs/tags/index.html b/fr/docs/tags/index.html index 6fb74aa9..1040dd64 100644 --- a/fr/docs/tags/index.html +++ b/fr/docs/tags/index.html @@ -4,7 +4,7 @@ Tags | TiBillet - + diff --git a/fr/docs/tags/logiciel-libre/index.html b/fr/docs/tags/logiciel-libre/index.html index c9acebe6..1028b981 100644 --- a/fr/docs/tags/logiciel-libre/index.html +++ b/fr/docs/tags/logiciel-libre/index.html @@ -4,7 +4,7 @@ Un document tagué avec "logiciel libre" | TiBillet - + diff --git a/fr/docs/tags/monnaie-locale/index.html b/fr/docs/tags/monnaie-locale/index.html index 88760c28..378c9631 100644 --- a/fr/docs/tags/monnaie-locale/index.html +++ b/fr/docs/tags/monnaie-locale/index.html @@ -4,7 +4,7 @@ Un document tagué avec "monnaie locale" | TiBillet - + diff --git a/fr/docs/tags/monnaies-locales/index.html b/fr/docs/tags/monnaies-locales/index.html index 21fbaf61..96f25c81 100644 --- a/fr/docs/tags/monnaies-locales/index.html +++ b/fr/docs/tags/monnaies-locales/index.html @@ -4,7 +4,7 @@ Un document tagué avec "monnaies locales" | TiBillet - + diff --git a/fr/docs/tags/monnaies-temps/index.html b/fr/docs/tags/monnaies-temps/index.html index 35c0fbec..11a512db 100644 --- a/fr/docs/tags/monnaies-temps/index.html +++ b/fr/docs/tags/monnaies-temps/index.html @@ -4,7 +4,7 @@ Un document tagué avec "monnaies temps" | TiBillet - + diff --git a/fr/docs/tags/open-source/index.html b/fr/docs/tags/open-source/index.html index c4e56f2d..35cfa02d 100644 --- a/fr/docs/tags/open-source/index.html +++ b/fr/docs/tags/open-source/index.html @@ -4,7 +4,7 @@ Un document tagué avec "open source" | TiBillet - + diff --git a/fr/docs/tags/paiement-dematerialise/index.html b/fr/docs/tags/paiement-dematerialise/index.html index eb3bf19c..3b467bca 100644 --- a/fr/docs/tags/paiement-dematerialise/index.html +++ b/fr/docs/tags/paiement-dematerialise/index.html @@ -4,7 +4,7 @@ Un document tagué avec "paiement dématérialisé" | TiBillet - + diff --git a/fr/docs/tags/prise-de-commandes/index.html b/fr/docs/tags/prise-de-commandes/index.html index db5e0845..22e51fc9 100644 --- a/fr/docs/tags/prise-de-commandes/index.html +++ b/fr/docs/tags/prise-de-commandes/index.html @@ -4,7 +4,7 @@ Un document tagué avec "prise de commandes" | TiBillet - + diff --git a/fr/docs/tags/stripe/index.html b/fr/docs/tags/stripe/index.html index 353c2cb0..6326ff96 100644 --- a/fr/docs/tags/stripe/index.html +++ b/fr/docs/tags/stripe/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "stripe" | TiBillet - + diff --git a/fr/docs/tags/ticketing/index.html b/fr/docs/tags/ticketing/index.html index 5a8307d6..1e837ce9 100644 --- a/fr/docs/tags/ticketing/index.html +++ b/fr/docs/tags/ticketing/index.html @@ -4,7 +4,7 @@ 5 documents tagués avec "ticketing" | TiBillet - + diff --git a/fr/docs/tags/tiers-lieux/index.html b/fr/docs/tags/tiers-lieux/index.html index 3826da5b..ba233755 100644 --- a/fr/docs/tags/tiers-lieux/index.html +++ b/fr/docs/tags/tiers-lieux/index.html @@ -4,7 +4,7 @@ Un document tagué avec "tiers-lieux" | TiBillet - + diff --git a/fr/index.html b/fr/index.html index 83ceb76e..e203fd38 100644 --- a/fr/index.html +++ b/fr/index.html @@ -4,7 +4,7 @@ TiBillet | TiBillet - + diff --git a/fr/roadmap/index.html b/fr/roadmap/index.html index 887fefb6..abd27101 100644 --- a/fr/roadmap/index.html +++ b/fr/roadmap/index.html @@ -4,7 +4,7 @@ Fonctionnalités | TiBillet - + diff --git a/index.html b/index.html index 20377ec8..7bc1a2df 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ TiBillet | TiBillet - + diff --git a/roadmap/index.html b/roadmap/index.html index 85fc7990..2b1ffd63 100644 --- a/roadmap/index.html +++ b/roadmap/index.html @@ -4,7 +4,7 @@ Fonctionnalités | TiBillet - +