<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://air.imag.fr/index.php?action=history&amp;feed=atom&amp;title=ECOM2016_LaReleve_-_Deploiement</id>
	<title>ECOM2016 LaReleve - Deploiement - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://air.imag.fr/index.php?action=history&amp;feed=atom&amp;title=ECOM2016_LaReleve_-_Deploiement"/>
	<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=ECOM2016_LaReleve_-_Deploiement&amp;action=history"/>
	<updated>2026-06-19T13:46:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://air.imag.fr/index.php?title=ECOM2016_LaReleve_-_Deploiement&amp;diff=32129&amp;oldid=prev</id>
		<title>Remi.Gattaz: Created page with &quot; &#039;&#039;&#039;Page d&#039;accueil du projet&#039;&#039;&#039;  = Déploiements = Ayant 5 machines à disposition, nous avons mis en place le déploiement suivant :  [[Image:ECOM2016_L...&quot;</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=ECOM2016_LaReleve_-_Deploiement&amp;diff=32129&amp;oldid=prev"/>
		<updated>2016-12-12T21:30:54Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;a href=&quot;/index.php/ECOM2016_LaReleve&quot; title=&quot;ECOM2016 LaReleve&quot;&gt; &amp;#039;&amp;#039;&amp;#039;Page d&amp;#039;accueil du projet&amp;#039;&amp;#039;&amp;#039;&lt;/a&gt;  = Déploiements = Ayant 5 machines à disposition, nous avons mis en place le déploiement suivant :  [[Image:ECOM2016_L...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[ECOM2016_LaReleve| &amp;#039;&amp;#039;&amp;#039;Page d&amp;#039;accueil du projet&amp;#039;&amp;#039;&amp;#039;]]&lt;br /&gt;
&lt;br /&gt;
= Déploiements =&lt;br /&gt;
Ayant 5 machines à disposition, nous avons mis en place le déploiement suivant :&lt;br /&gt;
&lt;br /&gt;
[[Image:ECOM2016_LaReleve_diagDeploy.png|1000px|center|Diagramme de déploiement]]&lt;br /&gt;
&lt;br /&gt;
On trouve dans ce déploiement : &lt;br /&gt;
- front-LaReleve : le client de notre application angular frontend&lt;br /&gt;
- deux HaProxy : un proxy permettant un load balancing entre deux instances de API-LaReleve&lt;br /&gt;
- deux API-LaReleve : notre API JEE&lt;br /&gt;
- deux Mysql-GR : Conteneur stockant notre base de donnée et mis en lien pour que leurs contenus ne diffèrent jamais (une opération dans une base implique la mise à jour de l&amp;#039;autre)&lt;br /&gt;
- Hawkular services&lt;br /&gt;
- Cassandra&lt;br /&gt;
- Grafana&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Composition docker ==&lt;br /&gt;
Sur chaque machines, uniquement des conteneur docker sont exécuté. Pour les contrôles facilement, des compositions docket ont donc été décrites. Voici ces compositions et les fichiers de configuration nécessaires à leurs fonctionnement :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ECOM-1 et ECOM-2 ===&lt;br /&gt;
Sur les serveurs ECOM-1 et ECOM-2 se trouvent un conteneur HAPROXY effectuant un load balancing sur deux serveur executant API-LaReleve. Effectuant du ssh, un script generate.sh a été créé pour créer facilement des certificats auto-signés. Les deux machines exécutent exactement les mêmes conteneurs et ont exactement la même configuration. Seul les certificats pour effectuer du http sont différents puisqu&amp;#039;il sont associé aux noms de domains liés au machine ECOM-1 et ECOM-2.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;docker-compose.yml&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot; line&amp;gt;&lt;br /&gt;
version: &amp;#039;2&amp;#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    haproxy:&lt;br /&gt;
        image: &amp;#039;haproxy:latest&amp;#039;&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;#039;443:443&amp;#039;&lt;br /&gt;
        volumes:&lt;br /&gt;
            - &amp;#039;./haproxy/etc/ssl:/etc/ssl&amp;#039;&lt;br /&gt;
            - &amp;#039;./haproxy/usr/local/etc/haproxy:/usr/local/etc/haproxy&amp;#039;&lt;br /&gt;
            - &amp;#039;./haproxy/dev/log:/dev/log&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;generate.sh&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
mkdir -p haproxy/etc/ssl&lt;br /&gt;
&lt;br /&gt;
# Certs&lt;br /&gt;
openssl genrsa -out haproxy/etc/ssl/air.key 2048&lt;br /&gt;
openssl req -new -key haproxy/etc/ssl/air.key -multivalue-rdn -subj &amp;quot;/C=FR/L=GRENOBLE/O=UGA/O=POLYTECH/OU=RICM/CN=AIR/emailAddress=air@imag.fr&amp;quot; -out haproxy/etc/ssl/air.csr&lt;br /&gt;
openssl x509 -req -days 365 -in haproxy/etc/ssl/air.csr -signkey haproxy/etc/ssl/air.key -out haproxy/etc/ssl/air.crt&lt;br /&gt;
cat haproxy/etc/ssl/air.crt haproxy/etc/ssl/air.key | tee haproxy/etc/ssl/air.pem&lt;br /&gt;
&lt;br /&gt;
# Dhparam&lt;br /&gt;
openssl dhparam -out haproxy/etc/ssl/dhparam.pem 2048&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;haproxy/usr/local/etc/haproxy/haproxy.cfg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line&amp;gt;&lt;br /&gt;
global&lt;br /&gt;
	log /dev/log local0&lt;br /&gt;
	log /dev/log local1 notice&lt;br /&gt;
	chroot /root/&lt;br /&gt;
	stats socket /var/run/haproxy.sock mode 660 level admin&lt;br /&gt;
	stats timeout 30s&lt;br /&gt;
	daemon&lt;br /&gt;
&lt;br /&gt;
	# Default ciphers to use on SSL-enabled listening sockets.&lt;br /&gt;
	# For more information, see ciphers(1SSL). This list is from:&lt;br /&gt;
	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/&lt;br /&gt;
	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS&lt;br /&gt;
	ssl-default-bind-options no-sslv3&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
	# log global&lt;br /&gt;
	mode http&lt;br /&gt;
	option httplog&lt;br /&gt;
	option dontlognull&lt;br /&gt;
	timeout connect 5000&lt;br /&gt;
	timeout client  50000&lt;br /&gt;
	timeout server  50000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
frontend localhost&lt;br /&gt;
        bind *:80&lt;br /&gt;
	mode http&lt;br /&gt;
	default_backend nodes&lt;br /&gt;
&lt;br /&gt;
frontend localhostS&lt;br /&gt;
	bind *:443 ssl crt /etc/ssl/air.pem&lt;br /&gt;
	mode http&lt;br /&gt;
	default_backend nodes&lt;br /&gt;
&lt;br /&gt;
# JavaEE servers are javaee01 and javaee02&lt;br /&gt;
backend nodes&lt;br /&gt;
	mode http&lt;br /&gt;
	balance roundrobin&lt;br /&gt;
	option forwardfor&lt;br /&gt;
	option httpchk HEAD / HTTP/1.1\r\nHost:localhost&lt;br /&gt;
	server ecom03 ecom-3:8080 check&lt;br /&gt;
	server ecom04 ecom-4:8080 check&lt;br /&gt;
	http-request set-header X-Forwarded-Port %[dst_port]&lt;br /&gt;
	http-request add-header X-Forwarded-Proto https if { ssl_fc }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ECOM-3 et ECOM-4 ===&lt;br /&gt;
Sur les serveurs ECOM-3 et ECOM-4 se trouvent API-LaReleve et les base de données associés à chacune. Avec l&amp;#039;utilisation de l&amp;#039;image docker Mysql-GR et la mise en place de paramètres dans la commande de lancement du conteneurs, les bases de données sont configurés en Group Replication. Cela veut dire que si une action est effectué sur une des deux bases, elle est immédiatement répliquer sur l&amp;#039;autre.&lt;br /&gt;
&lt;br /&gt;
Les noeuds sont lancés exactement de la même manière. Il faut pour cela récupéré le projet API-Runtime [https://github.com/ECOM-LaReleve/API-runtime/ (dépot)] et lancer la composition après avoir configuré les variables d&amp;#039;environnement et la commande de lancement du conteneur mysql-gr.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;docker-compose.yml&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot; line&amp;gt;&lt;br /&gt;
version: &amp;#039;2&amp;#039;&lt;br /&gt;
services:&lt;br /&gt;
    wildfly:&lt;br /&gt;
        image: gattazr/lareleve:latest&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;#039;8080:8080&amp;#039;&lt;br /&gt;
            - &amp;#039;9990:9990&amp;#039;&lt;br /&gt;
        environment:&lt;br /&gt;
            JAVA_OPTS: &amp;#039;-server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dcom.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true&amp;#039;&lt;br /&gt;
            #### Wildfly administration&lt;br /&gt;
            # ACTIVATE_ADMIN: 1&lt;br /&gt;
            # ADMIN_USERNAME: &amp;#039;admin&amp;#039;&lt;br /&gt;
            # ADMIN_PASSWORD: &amp;#039;admin123456&amp;#039;&lt;br /&gt;
            #### Mysql&lt;br /&gt;
            # MYSQL_HOST: &amp;#039;mysqldb:3306&amp;#039;&lt;br /&gt;
            # MYSQL_DATABASE: &amp;#039;lareleve&amp;#039;&lt;br /&gt;
            # MYSQL_USER: &amp;#039;lareleve&amp;#039;&lt;br /&gt;
            # MYSQL_PASSWORD: &amp;#039;lareleve123&amp;#039;&lt;br /&gt;
            #### Hawkular&lt;br /&gt;
            # HAWKULAR_HOST: &amp;#039;192.168.99.100:8080&amp;#039;&lt;br /&gt;
            # HAWKULAR_USERNAME: &amp;#039;jdoe&amp;#039;&lt;br /&gt;
            # HAWKULAR_PASSWORD: &amp;#039;password&amp;#039;&lt;br /&gt;
        volumes:&lt;br /&gt;
            - ./data/wildfly/log:/opt/jboss/wildfly/standalone/log&lt;br /&gt;
#            - ./data/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/&lt;br /&gt;
    mysqldb:&lt;br /&gt;
        image: &amp;#039;mysql/mysql-gr:latest&amp;#039;&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;#039;3306:3306&amp;#039;&lt;br /&gt;
            - &amp;#039;6606:6606&amp;#039;&lt;br /&gt;
        environment:&lt;br /&gt;
            MYSQL_DATABASE: &amp;#039;lareleve&amp;#039;&lt;br /&gt;
            MYSQL_USER: &amp;#039;lareleve&amp;#039;&lt;br /&gt;
            MYSQL_PASSWORD: &amp;#039;lareleve123&amp;#039;&lt;br /&gt;
            MYSQL_ROOT_PASSWORD: &amp;#039;mysqldb123&amp;#039;&lt;br /&gt;
            MYSQL_REPLICATION_USER: &amp;#039;rpl_user&amp;#039;&lt;br /&gt;
            MYSQL_REPLICATION_PASSWORD: &amp;#039;rpl_pass&amp;#039;&lt;br /&gt;
        volumes:&lt;br /&gt;
            - ./schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro&lt;br /&gt;
            - mysqlVolume:/var/lib/mysql&lt;br /&gt;
        command: sh -c &amp;#039;/entrypoint.sh --group_replication_group_seeds=&amp;quot;&amp;quot; --server-id=1&amp;#039;&lt;br /&gt;
#        command: sh -c &amp;#039;/entrypoint.sh --group_replication_group_seeds=&amp;quot;ecom4:6606&amp;quot; --server-id=1&amp;#039;&lt;br /&gt;
#        command: sh -c &amp;#039;/entrypoint.sh --group_replication_group_seeds=&amp;quot;ecom3:6606&amp;quot; --server-id=2&amp;#039;&lt;br /&gt;
volumes:&lt;br /&gt;
  mysqlVolume:&lt;br /&gt;
      driver: local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Remarque :&amp;#039;&amp;#039;&amp;#039; Les variables HAWKULAR_HOST, HAWKULAR_USERNAME, HAWKULAR_PASSWORD lié au conteneur wildfly sont des variables permettant le monitoring du conteneur. Si elles ne sont pas mise en place, aucun monitoring n&amp;#039;est effectué. Dans le cas contraire, elles doivent désigner un serveur hawkular-services avec des accès fonctionnels. Dans notre cas, il s&amp;#039;agit de la seconde composition se trouvant sur ECOM-5. Notez que Hawkular-services doit être lancé avant la création du conteneur wildfly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ECOM-5 ===&lt;br /&gt;
Sur ECOM-5 se trouve deux compositions. La première est très simple et permet de mettre en place . La second est légèrement plus complexe et permet la mise en place d&amp;#039;un système de monitoring de wildfly et donc des conteneurs API-LaReleve.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;frontend/docker-compose.yml&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line&amp;gt;&lt;br /&gt;
version: &amp;#039;2&amp;#039;&lt;br /&gt;
services:&lt;br /&gt;
    frontal:&lt;br /&gt;
        image: &amp;#039;gattazr/lareleve-front:latest&amp;#039;&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;#039;80:80&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;grafana/docker-compose.yml&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line&amp;gt;&lt;br /&gt;
version: &amp;#039;2&amp;#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    grafana:&lt;br /&gt;
        image: &amp;#039;welshstew/hawkular-metrics-grafana&amp;#039;&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;#039;3000:3000&amp;#039;&lt;br /&gt;
    cassandra:&lt;br /&gt;
        image: &amp;#039;cassandra:3.7&amp;#039;&lt;br /&gt;
        environment:&lt;br /&gt;
            CASSANDRA_START_RPC: &amp;#039;true&amp;#039;&lt;br /&gt;
    hawkular:&lt;br /&gt;
        image: &amp;#039;hawkularqe/hawkular-services:latest&amp;#039;&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;#039;8080:8080&amp;#039;&lt;br /&gt;
        environment:&lt;br /&gt;
            TEST_MODE: &amp;#039;true&amp;#039;&lt;br /&gt;
            JAVA_OPTS: &amp;#039;-server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dcom.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true&amp;#039;&lt;br /&gt;
            DB_TIMEOUT: 180&lt;br /&gt;
            CASSANDRA_NODES: &amp;#039;cassandra&amp;#039;&lt;br /&gt;
            HAWKULAR_USERNAME: &amp;#039;jdoe&amp;#039;&lt;br /&gt;
            HAWKULAR_PASSWORD: &amp;#039;password&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les Complications ==&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Les machines que nous avons manipulés pendant ce projet ont des ressources très limités. Notamment en mémoire. De ce fait, il peut être intéressant de mettre en place des partitions de SWAP si ce n&amp;#039;est pas des partitions présentes. &lt;br /&gt;
[[Image:ECOM2016_LaReleve_memfull.png|1000px|center|Resources limités des serveurs]]&lt;br /&gt;
&lt;br /&gt;
Les commandes suivantes permettent la création d&amp;#039;une partition de SWAP de 4Go.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024&lt;br /&gt;
/sbin/mkswap /var/swap.1&lt;br /&gt;
chmod 600 /var/swap.1&lt;br /&gt;
/sbin/swapon /var/swap.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Réseaux ===&lt;br /&gt;
Suivant les machines utilisés pour faire ce déploiement, des problèmes peuvent apparaitre pour joindre une machine ou une autre. La présence de proxy devant les machines ECOM-3 et ECOM-4 peuvent par exemple amener des problèmes. Aussi, pour faire fonctionner certains services, il peut être nécessaire qu&amp;#039;une certaine topologie réseaux soit mise en place.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;exemple le plus flagrant vient des machines ECOM-3 et ECOM-4. La réplication de la base de donnée avec MySQL Group Replication (mysql-gr) nécessite que ces deux machines se trouvent sur un même réseau local.&lt;/div&gt;</summary>
		<author><name>Remi.Gattaz</name></author>
	</entry>
</feed>