[![](assets/logo-opencell.png)](https://opencellsoft.com)

# Mise en place et </br> administration d'Opencell

###### Antoine Michéa ( [antoine.michea@opencellsoft.com](mailto:antoine.michea@opencellsoft.com) )

---

## Etapes

1. Récupération du code source et compilation
2. Installation et configuration de WildFly
3. Mise en place de la base de donnée
4. Utilisation des images docker
5. Interface d'administration de Opencell
6. Reprise en cas d'interruption 
7. Surveillance et mise en place d'alertes
8. Mise à jour et sauvegarde
9. Mise en place des frontaux
10. Reverse proxy
11. Haute disponibilité
12. Critères dimensionnant
13. API

---

## Code source, compilation & SQL

#### Prérequis:

- Java 8
- maven 3
- git

#### Création du WAR  (Web Application Archive)

```terminal
git clone git://git.assembla.com/meveo.git
cd meveo
mvn clean package
ls -l opencell-admin/web/target/
```
---
#### Création du SQL d'import

```bash
mvn -f opencell-model/pom.xml -Ddb.url=offline:postgresql?outputLiquibaseSql=true -Prebuild liquibase:updateSQL
ls -l opencell-model/target/liquibase/
```

#### Avec docker
```bash
docker run --rm -v $PWD/opencell-model/src/main/db_resources/changelog:/src/main/db_resources/changelog -e CHANGELOG_FILE=src/main/db_resources/changelog/db.rebuild.xml -e MODE=script_postgresql opencell/opencell-liquibase
ls opencell-model/src/main/db_resources/changelog/
```

---
## Installation et configuration de WildFly

#### Versions

> Opencell version 4.4.1 et inferieures


* Serveur d'application : Jboss EAP 6.2 / Jboss 7.2
* Bases: PostgresSql v9.2 (Mysql v5.7, Maria DB v10.1)
* Java JKD: 1.6-1.8 (EAP)


> Opencell superieur à la verison 4.5


* Application server: Widlfly 10.1
* Databases: PostgresSql v.9.2, Mysql v.5.7, Maria DB v.10.1
* Java JDK: 1.8
 


---
#### Prérequis

- Avoir installé JDK8

#### Creation du répértoire et utilisateur dédié

`useradd --system --comment WildflyAS --create-home --home /opt/jboss --user-group jboss && su - jboss`

#### From scrtach

```sh
curl -O http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.zip
unzip -qq wildfly-10.1.0.Final.zip -d /opt/jboss/
mv wildfly-10.1.0.Final wildfly
```

#### Version pré-packagée

```sh
curl -O http://dl.opencellsoft.com/wildfly.zip
unzip -qq wildfly.zip -d /opt/jboss/
```

---
## Configuration de WildFly pour Opencell


### Ajout des caches infinispan (=<v4.5)
Dans le noeud XML `<subsystem infinispan">` du fichier de configuration standalone.xml, ajouter :
```xml
<cache-container name="meveo">
 <local-cache name="meveo-price-plan"/>
 <local-cache name="meveo-usage-charge-template-cache-cache"/>
 <local-cache name="meveo-charge-instance-cache"/>
 <local-cache name="meveo-counter-cache"/>
 <local-cache name="meveo-edr-cache"/>
 <local-cache name="meveo-access-cache"/>
 <local-cache name="meveo-cfv-cache"/>
 <local-cache name="meveo-cft-timeout-cache"/>               
 <local-cache name="meveo-cft-cache"/>
 <local-cache name="meveo-cet-cache"/>
 <local-cache name="meveo-notification-cache"/>
 <local-cache name="meveo-balance"/>
 <local-cache name="meveo-reservedBalance"/>
 <local-cache name="meveo-usageChargeInstanceWallet"/>
</cache-container>
```
---
### Ajout des caches infinispan (>=v4.5.1)
Dans le noeud XML `<subsystem infinispan">` du fichier de configuration standalone.xml, ajouter :
```xml
<cache-container name="opencell">
 <local-cache name="opencell-price-plan"/>
 <local-cache name="opencell-usage-charge-template-cache"/>
 <local-cache name="opencell-charge-instance-cache"/>
 <local-cache name="opencell-counter-cache"/>
 <local-cache name="opencell-edr-cache"/>
 <local-cache name="opencell-access-cache"/>
 <local-cache name="opencell-cfv-cache"/>
 <local-cache name="opencell-cft-timeout-cache"/>
 <local-cache name="opencell-cft-cache"/>
 <local-cache name="opencell-cet-cache"/>
 <local-cache name="opencell-notification-cache"/>
 <local-cache name="opencell-balance"/>
 <local-cache name="opencell-reservedBalance"/>
 <local-cache name="opencell-usageChargeInstanceWallet"/>
</cache-container>
```

---

### Ajout du driver JDBC Postgresql

```sh
mkdir /opt/jboss/config
curl https://jdbc.postgresql.org/download/postgresql-42.0.0.jar > /opt/jboss/config/postgresql-42.0.0.jar

cat << EOF > /opt/jboss/config/driver.cli
embed-server
batch
deploy /opt/jboss/config/postgresql-42.0.0.jar
module add --name=org.postgresql --slot=main --resources=/opt/jboss/config/postgresql-42.0.0.jar --dependencies=javax.api,javax.transaction.api
/subsystem=datasources/jdbc-driver=postgresql:add(driver-module-name=org.postgresql,driver-name=postgresql,driver-class-name=org.postgresql.Driver)
run-batch
EOF
$WILDFLY_HOME/bin/jboss-cli.sh --file=/opt/jboss/config/driver.cli
```

### Ajout de la source de donnée

---

```xml
<datasource jta="true" jndi-name="java:jboss/datasources/MeveoAdminDatasource" pool-name="meveo" enabled="true" use-java-context="true" use-ccm="true">
 <connection-url>jdbc:${env.DB_TYPE:postgresql}://${env.DB_HOST:localhost}:${env.DB_PORT:5432}/${env.DB_NAME:opencell_db}</connection-url>
 <driver-class>${env.DB_DRIVER:org.postgresql.Driver}</driver-class>
 <driver>${env.DB_TYPE:postgresql}</driver>
 <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
 <pool>
  <min-pool-size>2</min-pool-size>
  <max-pool-size>50</max-pool-size>
 </pool>
 <security>
  <user-name>${env.DB_USER:opencell_db_user}</user-name>
  <password>${env.DB_PASSWORD:opencell_db_password}</password>
 </security>
 <validation>
  <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
  <background-validation>true</background-validation>
  <background-validation-millis>60000</background-validation-millis>
 </validation>
 <pool>
  <flush-strategy>IdleConnections</flush-strategy>
 </pool>
</datasource>
```

---

### Configuration de l'envoi de mail

Dans le nœud XML `<subsystem xmlns="urn:jboss:domain:mail:2.0">` du fichier de configuration `standelone.xml`, ajouter :
```xml
<mail-session name="meveomail" jndi-name="java:/MeveoMail">
 <smtp-server outbound-socket-binding-ref="mail-smtp" />
</mail-session>
```

Puis votre serveur SMTP dans la section `<outbound-socket-binding name="mail-smtp">`
Exemple : 
```xml
<remote-destination host="smtp.gmail.com" port="465"/>
```
---

### Ajout du client keycloak
```bash
cd /opt/jboss/wildfly/
curl -L https://downloads.jboss.org/keycloak/3.0.0.Final/adapters/keycloak-oidc/keycloak-wildfly-adapter-dist-3.0.0.Final.tar.gz | tar zx 
/opt/jboss/wildfly/bin/jboss-cli.sh --file=/opt/jboss/wildfly/bin/adapter-install-offline.cli
```

> Possibilité d'utiliser le même SGBD qu'opencell pour keycloak en créant une nouvelle base (postgresql ou mariadb)

---

### Configuration diverses

#### Configuration du timeout des transactions (Obsolète)

Dans la section `<subsystem xmlns="urn:jboss:domain:transactions:2.0">`
```xml
<coordinator-environment default-timeout="7200"/>
```

#### Configuration des logs

Section `<subsystem xmlns="urn:jboss:domain:logging:3.0">`

---

### Configuration de la JVM

Configuration minimale (fichier `bin/standalone.conf`) :
```sh
JAVA_OPTS="-Xms1300m -Xmx2048m -XX:MetaspaceSize=96m -XX:MaxMetaspaceSize=512m"
```
Pour une configuration de production indiquer Xms et Xmx à une même valeur et à environ 40% de la mémoire disponible sur le serveur sans dépasser plus de 31Go.

> Exemple, pour un serveur muni de 7,5Go de RAM, disponible, nous allouons 3Go, `-Xms3g –Xmx3g`


---
### Configuration pour passer par un reverse porxy


```bash
cat << EOF > /opt/jboss/config/proxy.cli
embed-server --server-config=standalone.xml
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=proxy-address-forwarding, value=true)
EOF
$WILDFLY_HOME/bin/jboss-cli.sh --file=/opt/jboss/config/proxy.cli
```

---
### Mise ne place du serveur keycloak sur notre WildFly

```bash
cd /opt/jboss/wildfly/
curl -L https://downloads.jboss.org/keycloak/3.0.0.Final/keycloak-overlay-3.0.0.Final.tar.gz | tar zx 
/opt/jboss/wildfly/bin/jboss-cli.sh --file=/opt/jboss/wildfly/bin/keycloak-install.cli
/opt/jboss/wildfly/bin/add-user-keycloak.sh -u admin -p admin
```

---
## Mise en place de la base de donnée

Création ou récupération du script d'import initial.
```terminal
curl -O http://dl.opencellsoft.com/current/import-postgres.sql
```
Création de la base et de l'utilisateur.

```sql
CREATE USER opencell_db_user WITH PASSWORD 'opencell_db_password';
CREATE DATABASE opencell_db;
GRANT ALL PRIVILEGES ON DATABASE opencell_db to opencell_db_user;
```

Import des données initales.
```sh
export PGPASSWORD=opencell_db_password
psql --dbname=opencell_db --username=opencell_db_user --host=localhost < ./import-postgres.sql
```
---

### Recomendations, conseils et informations

* Postgres doit être démarré et accessible avant le lancement du serveur Jboss.
* La reconnexion à la base est automatique.
* postgresql.conf > configuration du serveur postgres (listen_addresses).
* pg_hba.conf > configuration des accès.
* Adminer > WEB GUI légère d'administration de la base.

---

### Lancemant du serveur WildFly

/opt/jboss/wildfly/bin/standalone.sh  
-b 0.0.0.0 -bmanagement 0.0.0.0  
-Dkeycloak.migration.action=import  
-Dkeycloak.migration.provider=singleFile  
-Dkeycloak.migration.strategy=IGNORE_EXISTING  
-Dkeycloak.migration.file=/opt/jboss/opencell-realm-admin-sc-cc.json  
**-Dopencell.keycloak.secret**=xxxxxxxx-xxxx-xxxx-xxx-xxx  
**-Dopencell.keycloak.url**=http://jboss:8080/auth  
**-Dopencell.keycloak.realm**=opencell  
**-Dopencell.keycloak.client**=opencell-web  
-Dopencell.keycloak.ssl=none    
-Dopencell.keycloak.basic-auth=true   


---
## Utilisation des images docker

#### Prérequis
* [Docker engine](https://www.docker.com/products/overview)
* [Docker compose](https://docs.docker.com/compose/install/)

#### Création d'un environnement complet de démo
`curl https://docker.opencellsoft.com/deploy-opencell-try.sh | bash`

#### Fichier docker-compose.yml de base
`curl -O https://docker.opencellsoft.com/docker-compose.yml`

---

## Interface d'administration

L'interface d'administration est disponible à l'URL:
`http://jboss-host:8080/opencell`

Première connexion avec le super utilisateur :
`opencell.superadmin / opencell.superadmin`

Etude du menu `Configuration (System settings)` du menu `Administration`

### Le fichier meveo.properties

[Documentation complète des proprietes](https://opencell.assembla.com/spaces/meveo-enterprise/wiki/4_4_System_settings)  
Parametrage de formatage (invoicing.invoiceAdjustment.prefix, connectorCRM.*, csv.characterEncoding, excelImport.dateFormat, invoice.dateFormat, mediation.extensions, meveo.dateFormat, meveo.dateTimeFormat)

---


**elasticsearch.client.transport.sniff** > Activation de la détection automatique 

**elasticsearch.cluster.name** > Nom du cluster  

**elasticsearch.hosts** > Hôte ou liste d'hôtes séparée par ";" pour une grappe  

**elasticsearch.port** > Port à utiliser (9300) pour le client de recherche JAVA  

**elasticsearch.restUri** > URL complète de recherche par API Rest (http\://es\:9200)  

---


**password.Expiracy** > durée en jour d'expiration du mot de passe.  

**password.expiration.Notification** > durée en jour de notification avant expiration.  

**providers.rootDir** > Chemin vers le répertoire source du provider. 

**secured.entities.enabled** > Permet d'activer la restriction d'accès à certain comptes et offres. 

---

## Reprise en cas d'interruption

Cas général :
* Médiation
* Rating
* Invoicing

Cas particuliers :
* Transfert FTP

---

## Surveillance et mise en place d'alertes

### Log Jboss

Configuration du fichier `standelone.xml` section `<subsystem xmlns="urn:jboss:domain:logging:2">`

### Webhook

Utilisation des systèmes de notification pour être averti d'une anomalie

### Outils tiers

Zabbix, Nagios, ELK
Cadvisor, Prometheus, Grafana

---

## Mise à jour et sauvegarde

Lors de la sortie nouvelle version la procédure complète est indiquée sur la [release note du wiki](https://opencell.assembla.com/spaces/meveo-enterprise/wiki/Release_notes)

Principales étapes de mise à jour :
1. Sauvegarde des fichiers et de la base
2. Nouveau WAR à déployer
3. Mise à jour de la base (passage d'un script SQL)
4. Configuration à ajouter ou modifier pour Jboss

Sauvegarde des fichiers: Copier le contenu du répertoire indiqué dans la propriété `providers.rootDir`
Sauvegarde de la base via par exemple `pg_dump`

---

## Mise en place des frontaux - Selfcare

Compilation (requière l'installation de nodejs 4.5) :
```terminal
git clone https://git.assembla.com/opencell-selfcare.git
cd opencell-selfcare
npm install
npm run webpack
mkdir frontend
mkdir frontend/sc
cp -r lib frontend/sc/
cp -r assets frontend/sc/
cp -r ext-lib frontend/sc/
cp -r images frontend/sc/
cp -r stylesheet frontend/sc/
cp favicon.ico frontend/sc/
cp index.html frontend/sc/
cd frontend/sc/
zip -r9  ../../selcare.zip *
```
---

Récupération de l'archive compilée 

`curl -O http://dl.opencellsoft.com/current/selcare/frontend.zip`

Upload et unzip via l'interface d'administration ou via FS dans le répertoire fontend du provider (propriété `providers.rootDir`)

URL:  `http://{sever}/meveo/frontend/{PROVIDER}/sc/index.html`

Ajout des modules et rôles via SOAPUI.

---

## Mise en place des frontaux - CustomerCare

Compilation (requière l'installation de nodejs 4.5) :
```sh
git clone git@git.assembla.com:opencell-customercare.git
cd opencell-customercare
npm install
npm run deploy
mkdir frontend
mkdir frontend/cc
cp -r lib frontend/cc/
cp -r assets frontend/cc/
cp -r ext-lib frontend/cc/
cp -r images frontend/cc/
cp -r stylesheet frontend/cc/
cp favicon.ico frontend/cc/
cp index.html frontend/cc/
cd frontend/cc/
zip -r9  ../../customercare.zip *
```
---

Récupération de l'archive compilée 

`curl -O http://dl.opencellsoft.com/current/customercare/frontend.zip`

Upload et unzip via l'interface d'administration ou via FS dans le répertoire fontend du provider (propriété `providers.rootDir`)

URL:  `http://{sever}/meveo/frontend/{PROVIDER}/cc/index.html`

Ajout des modules et rôles via SOAPUI.

---

## Reverse Proxy

### Usage

Protection, acces multiples url, https, repartition de charge, HA, CORS

### Logiciels

Caddy server, Apache mod-cluster, Træfik, Nginx, HAProxy, ...

### Divers

Installation des frontaux hors opencell

---

## Haute disponibilité

### Jboss en mode cluster


![](assets/multiple_mod_cluster.jpg)



#### Fichier docker-compose.yml version HA
`curl -O https://docker.opencellsoft.com/docker-compose-ha.yml`

Test de scalabilité: `docker-compose scale jboss=X`

Connexion sur l'interface Apache du module mod_cluster :
`http://127.0.0.1/mcm`

---

### Cluster de base avec Postgresql

### Cluster de base avec Mariadb / MaxScale


---

## Critères dimensionnant

* Taille des EDR
* Taille des templates PDF utilisés

---

## API

### Rest et SOAP

### Documentation disponible sur :
https://api.opencellsoft.com/ (swagger)

### Divers scripts SOAPUI

---

## Recapitulatif des liens

[Espace entrepise](https://opencell.assembla.com/spaces/meveo-enterprise) (documentation, release notes et mise à jour)

[Espace communautaire](https://opencell.assembla.com/spaces/meveo) (sources et documentation)

[Dépôt Selfcare](https://opencell.assembla.com/spaces/opencell-selfcare) (accès entreprise)

[Dépôt CustomerCare](https://opencell.assembla.com/spaces/opencell-customercare) (accès entreprise)

---

# Merci.


