') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - Mon-ENT/springboard: Lancez votre ENT en moins de 5 minutes ! · GitHub
Skip to content

Repository files navigation

Mon-ENT/springboard

Lancez votre ENT en 5 minutes !

Trois choix de déploiement s'offrent à vous :

  • Docker Compose (recommandé pour un ENT n'ayant pas besoin de répartir les charges)
  • Docker Swarm (recommandé pour un ENT répartissant les charges entre différents serveurs)

Chaque service n'est pas répliqué. Si vous le pouvez, utilisez le mode Docker Swarm ; il est plus optimisé pour une instance de production. Ce mode est faillible au Single Point of Failure (SPOF).

Pour faciliter la représentation, nous supposons que nous activons uniquement le module blog.

architecture-beta
group docker(server)[Serveur Docker]
service internet(cloud)[Internet]
service elasticsearch[Elasticsearch] in docker
service mongo[MongoDB] in docker
service neo4j[Neo4J] in docker
service postgres[PostgreSQL] in docker
service redis[Redis] in docker
service vertx-blog[Blog] in docker
service traefik(internet)[Traefik] in docker
service zookeeper[Zookeeper] in docker
internet:B --> T:traefik
traefik:B -- T:zookeeper
vertx-blog:R -- L:zookeeper
traefik:L --> T:vertx-blog
Loading

Chaque service est répliqué autant de fois qu'il y a de nodes disponibles (sauf pour certains services qui sont fixés à 3 répliques). Ce mode résiste au Single Point of Failure (SPOF) et permet véritablement de répartir les charges entre différents serveurs.

  • Le cluster est composé de trois nodes.
  • Les services nécéssitant un nombre fixe de répliques sont au nombre de 2.
  • Seul le module blog est activé pour l'exemple.
architecture-beta
group swarm-cluster(server)[Cluster Docker Swarm]
group server-1(server)[Serveur 1] in swarm-cluster
group server-2(server)[Serveur 2] in swarm-cluster
group server-3(server)[Serveur 3] in swarm-cluster
service internet(cloud)[Internet]
service load-balancer(cloud)[Load Balancer]
service traefik-1(internet)[Traefik] in server-1
service traefik-2(internet)[Traefik] in server-2
service traefik-3(internet)[Traefik] in server-3
internet:B --> T:load-balancer
load-balancer:B --> T:traefik-1
load-balancer:B --> T:traefik-2
load-balancer:B --> T:traefik-3
Loading

About

Lancez votre ENT en moins de 5 minutes !

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages