# Mettre en place OnlyOffice Docker avec Nextcloud

##### Prérequis :

- Avoir un nom de domaine 
    - Dans notre cas nous utiliserons le nom de domaine : `miraceti.net`
- Avoir une configuration de **<span style="text-decoration: underline;">Nextcloud Docker</span>** fonctionnel 
    - Sinon suivre le tuto suivant : [Déployer Nextcloud Docker](https://wiki.mira-ceti.ovh/books/nextcloud-docker/page/mettre-en-place-nextcloud-docker "Mettre en place Nextcloud Docker")

#### Configuration nom de domaine

Grâce à notre nom de domaine, nous allons pouvoir créer des sous domaine (en CNAME `A`).

Sur le site de gestion de notre nom de domaine respectif, dans la section DNS, ajouter l'entrée suivante :

<div class="pointer-container" id="bkmrk-%C2%A0-0"><div class="pointer anim is-page-editable"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg><div class="input-group inline block"> <button class="button outline icon" data-clipboard-target="#pointer-url" title="Copier le lien" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>- sub.domaine.ext A ip.adress.server 
    - Soit
- office.miraceti.net A 12.34.56.78

#### Préparation des fichiers de configuration

<p class="callout info">Il est conseillé de rajouter les configurations suivantes (`docker-compose.yml` et `.env`) directement dans les fichiers</p>

<p class="callout info">correspondants à la configuration Nextcloud.   
Mais il est aussi possible de séparer la configuration Nextcloud et la configuration Onlyoffice. Cependant il faudra mettre le conteneur Nextcloud dans un même `network` que le conteneur Onlyoffice.</p>

Se placer dans le dossier contenant les fichiers `docker-compose.yml` et `.env` de la configuration Nextcloud Docker.

Edition du fichier `docker-compose.yml` :

```yaml
 ...(services nextcloud)...

  postgres-onlyoffice:
    image: ${ONLYOFFICE_DOCUMENT_POSTGRES_IMAGE_TAG}
    container_name: postgres-onlyoffice
    volumes:
      - onlyoffice-document-postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: ${ONLYOFFICE_DOCUMENT_DB_NAME}
      POSTGRES_USER: ${ONLYOFFICE_DOCUMENT_DB_USER}
      POSTGRES_HOST_AUTH_METHOD: trust
    networks:
      - office-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s
    restart: unless-stopped

  redis-onlyoffice:
    image: ${ONLYOFFICE_DOCUMENT_REDIS_IMAGE_TAG}
    container_name: redis-onlyoffice
    volumes:
      - redis-onlyoffice-document-data:/data
    networks:
      - office-network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s
    restart: unless-stopped

  rabbitmq-onlyoffice:
    image: ${ONLYOFFICE_DOCUMENT_RABBITMQ_IMAGE_TAG}
    container_name: rabbitmq-onlyoffice
    volumes:
      - rabbitmq-onlyoffice-document-data:/bitnami/rabbitmq/mnesia
    environment:
      RABBITMQ_USERNAME: ${ONLYOFFICE_DOCUMENT_RABBITMQ_USER}
      RABBITMQ_PASSWORD: ${ONLYOFFICE_DOCUMENT_RABBITMQ_PASSWORD}
      POSTGRES_PASSWORD: ${ONLYOFFICE_DOCUMENT_DB_PASSWORD}
      RABBITMQ_MANAGEMENT_ALLOW_WEB_ACCESS: true
    networks:
      - office-network
    healthcheck:
      test: rabbitmq-diagnostics -q ping
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 90s
    restart: unless-stopped

  onlyoffice-document:
    image: ${ONLYOFFICE_DOCUMENT_IMAGE_TAG}
    container_name: onlyoffice
    volumes:
      - onlyoffice-document-data:/var/www/onlyoffice/Data
      - onlyoffice-document-log:/var/log/onlyoffice
      - onlyoffice-document-cache-files:/var/lib/onlyoffice/documentserver/App_Data/cache/files
      - onlyoffice-document-public-files:/var/www/onlyoffice/documentserver-example/public/files
      - onlyoffice-document-fonts:/usr/share/fonts
    environment:
      DB_TYPE: postgres
      DB_HOST: postgres-onlyoffice
      DB_PORT: 5432
      DB_NAME: ${ONLYOFFICE_DOCUMENT_DB_NAME}
      DB_USER: ${ONLYOFFICE_DOCUMENT_DB_USER}
      DB_PWD: ${ONLYOFFICE_DOCUMENT_DB_PASSWORD}
      AMQP_URI: amqp://${ONLYOFFICE_DOCUMENT_RABBITMQ_USER}:${ONLYOFFICE_DOCUMENT_RABBITMQ_PASSWORD}@rabbitmq-onlyoffice
      REDIS_SERVER_HOST: redis-onlyoffice
      REDIS_SERVER_PORT: 6379
      JWT_ENABLED: true
      JWT_SECRET: ${ONLYOFFICE_DOCUMENT_JWT_SECRET}
      JWT_HEADER: Authorization
      JWT_IN_BODY: 'true'
    networks:
      - office-network
      - bddnetwork
    ports: 
      - 8081:80
    restart: unless-stopped
    depends_on:
      postgres-onlyoffice:
        condition: service_healthy
      rabbitmq-onlyoffice:
        condition: service_healthy
#      nextcloud:
#        condition: service_healthy
```

Edition du fichier `.env` :

```ini
...(Nextcloud Variables)..

# OnlyOffice Variables
ONLYOFFICE_DOCUMENT_POSTGRES_IMAGE_TAG=postgres:15
ONLYOFFICE_DOCUMENT_REDIS_IMAGE_TAG=redis:7.2
ONLYOFFICE_DOCUMENT_RABBITMQ_IMAGE_TAG=bitnami/rabbitmq:3.13.4
ONLYOFFICE_DOCUMENT_IMAGE_TAG=onlyoffice/documentserver:8.1
ONLYOFFICE_DOCUMENT_HOSTNAME=office.miraceti.net
ONLYOFFICE_DOCUMENT_DB_NAME=onlyoffice
ONLYOFFICE_DOCUMENT_DB_USER=onlyofficedbuser
ONLYOFFICE_DOCUMENT_DB_PASSWORD=yVNyHP2keUeD5wD3vkrb
ONLYOFFICE_DOCUMENT_JWT_SECRET=7bukHBGUEzvCjHrYKuT8
ONLYOFFICE_DOCUMENT_RABBITMQ_USER=rabbitmqdb
ONLYOFFICE_DOCUMENT_RABBITMQ_PASSWORD=FX7zuRA7y2wVUNkYwtwH
```

#### Création du network pour OnlyOffice

Nous allons créer un network "`office-network`" pour lier les conteneurs/services suivants entre eux :

- postgres-onlyoffice
- redis-onlyoffice
- rabbitmq-onlyoffice
- onlyoffice

```bash
sudo docker network create office-network
```

Vérification que le nouveau network existe :

```bash
sudo docker network ls
```

#### Configuration Apache2

Création d'un nouveau host dans `/etc/apache2/sites-available` avec le nom suivant "`office.miraceti.net.conf`":

```
<VirtualHost *:80>
        ServerName office.miraceti.net

	ErrorLog ${APACHE_LOG_DIR}/office.miraceti.net.log
        CustomLog ${APACHE_LOG_DIR}/office.miraceti.net.log combined

	ProxyPreserveHost On
	ProxyRequests Off        
        ProxyPass / http://localhost:8083/			# Port Used by container OnlyOffice
        ProxyPassReverse / http://localhost:8083/	# Port Used by container OnlyOffice

        <IfModule mod_dav.c>
           Dav off
        </IfModule>

	  <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>
</VirtualHost>
```

Tester la configuration :

```
sudo apachectl configtest
```

Activation du nouveau host :

```
a2ensite office.miraceti.net.conf
```

Vérifier que l'accès via L’URL `office.miraceti.net` est bien accessible en HTTP.

 Une fois accessible, il faut rendre sécurisé (HTTPS) l'accès à cette URL :

```
sudo certbot --apache -d office.miraceti.net
```

Ce qui générera le fichier suivant `office.miraceti.net-le-ssl.conf`. Ajouter la configuration suivante à la fin du fichier avant la balise de fin "`<VirtualHost>`" :

```
SetEnvIf Host "^(.*)$" THE_HOST=$1
RequestHeader setifempty X-Forwarded-Proto https
RequestHeader setifempty X-Forwarded-Host %{THE_HOST}e
ProxyAddHeaders Off
ProxyPass /.well-known !
ProxyPassMatch (.*)(\/websocket)$ "ws://localhost:8081/$1$2"
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
```

Ce qui donne le fichier final :

```
<IfModule mod_ssl.c>
<VirtualHost *:443>
		ServerName office.miraceti.net

		ErrorLog ${APACHE_LOG_DIR}/office.miraceti.net.log
        CustomLog ${APACHE_LOG_DIR}/office.miraceti.net.log combined

        SetEnvIf Host "^(.*)$" THE_HOST=$1
        RequestHeader setifempty X-Forwarded-Proto https
        RequestHeader setifempty X-Forwarded-Host %{THE_HOST}e
        ProxyAddHeaders Off
        ProxyPass /.well-known !
        ProxyPassMatch (.*)(\/websocket)$ "ws://localhost:8081/$1$2"
        ProxyPreserveHost On
        ProxyRequests Off        
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/

        <IfModule mod_dav.c>
           Dav off
        </IfModule>

		<Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>

        SSLCertificateFile /etc/letsencrypt/live/office.miraceti.net/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/office.miraceti.net/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```