Erreur installation MariaDB sur Docker Synology

Bonjour,

Je cherche à migrer mon installation Jeedom d’un Raspberry Pi3B de plus en plus instable (freeze tous les 2 ou 3 jours) vers un Synology DS423+.

J’ai essayé les différents tuto macvlan de Didier3L (pour utilisation du plugin Xiaomi notamment), en vain, je rencontre systématiquement des erreurs. Très certainement de mon fait, étant novice en utilisation de Docker.

Ayant vu que @Loic avait mis à jour très récemment la documentation officielle pour installation Synology, j’ai décidé de l’utiliser en prenant l’option Docker-Compose qui me permet de déclarer mes périphériques USB. J’ai également ajouté un mapping des volumes et l’utilisation de l’image 4.3-buster (également testé avec 4.4-buster).

Au lancement du Docker-Compose, l’installation MariaDB se met en erreur avec le message ci-dessous :

Installing MariaDB/MySQL system tables in '/var/lib/mysql/' ...

Installation of system tables failed!  Examine the logs in
/var/log/mysql/error.log or /var/lib/mysql/ for more information.

The problem could be conflicting information in an external
my.cnf files. You can ignore these by doing:

    shell> /usr/bin/mysql_install_db --defaults-file=~/.my.cnf

You can also try to start the mysqld daemon with:

    shell> /usr//sbin/mysqld --skip-grant-tables --general-log &

and use the command line tool /usr//bin/mysql
to connect to the mysql database and look at the grant tables:

    shell> /usr//bin/mysql -u root mysql
    mysql> show tables;

Try 'mysqld --help' if you have problems with paths.  Using
--general-log gives you a log in /var/lib/mysql/ that may be helpful.

The latest information about mysql_install_db is available at
https://mariadb.com/kb/en/installing-system-tables-mysql_install_db
You can find the latest source at https://downloads.mariadb.org and
the maria-discuss email list at https://launchpad.net/~maria-discuss

Please check all of the above before submitting a bug report
at http://mariadb.org/jira

Stopping MariaDB database server: mysqld.
Starting MariaDB database server: mysqld . . . . . . . . . . . . . . . . . . . . . .                                       . . . . . . . . failed!
mariadb: unrecognized service

J’ai vérifié les droits des répertoires « db » & « html » et ils semblent OK, je n’arrive pas à comprendre d’où vient cette erreur (qui du coup bloque l’installation de Jeedom).
Auriez-vous une idée ?
Merci d’avance !

Bonjour
Ok je vois d’où ça vient c’est corrigé en 4.4 mais pas en 4.3 il faut prendre la version alpha du docker

1 « J'aime »

Pour info voila la conf que j’utilise chez moi et qui marche (sur syno), peut etre juste les chemin a revoir et bien sur la partie mot de passe :

services:
  db:
    image: mariadb:latest
    command: 
      - "--default-authentication-plugin=mysql_native_password"
      - "--skip-name-resolve"
      - "--key_buffer_size=16M"
      - "--thread_cache_size=16"
      - "--tmp_table_size=48M"
      - "--max_heap_table_size=48M"
      - "--query_cache_type=1"
      - "--query_cache_size=32M"
      - "--query_cache_limit=2M"
      - "--query_cache_min_res_unit=3K"
      - "--innodb_flush_method=O_DIRECT"
      - "--innodb_flush_log_at_trx_commit=2"
      - "--innodb_log_file_size=32M"
      - "--innodb_large_prefix=on"
      - "--connect_timeout=600"
      - "--wait_timeout=600"
      - "--interactive_timeout=600"
    volumes:
      - /volume2/docker/jeedom/db:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=TODO
      - MYSQL_DATABASE=jeedom
      - MYSQL_USER=jeedom
      - MYSQL_PASSWORD=TODO
    expose:
      - 3306
  http:
    image: jeedom/jeedom:4.4-http-bookworm
    volumes:
      - /volume2/docker/jeedom/http:/var/www/html
    tmpfs:
      - /tmp/jeedom
    ports:
      - 52080:80
    restart: always
    environment:
      - DB_HOST=db
      - DB_USERNAME=jeedom
      - DB_PASSWORD=TODO
      - DB_NAME=jeedom
    healthcheck:
      test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:80"]
      interval: 30s
      timeout: 10s
      retries: 5
    depends_on:
      - db
2 « J'aime »

Super, merci Loïc, je teste cela dès que possible sur mon NAS !

Bonsoir Loic

On revient un peu comme à l’époque
Un conteneur pour chaque service
Jeedom core et MariaDB

Bonjour
Oui mais cette fois je comprends un peu mieux comment ça marche

Dans dans ton docker-compose il n’y a pas de mappage de port USB

Tu n’utilises pas de clé USB spécifique (zigbee, zwave, etc) ?

Non je n’en utilise pas.

héhé, c’est une bonne idée :slight_smile: prochaine étape, sortir le cron dans un container scheduler externe, j’utilise chadburn qui se configure simplement, puis ensuite le container jeedom devient un simple serveur apache + php, une image officielle stable existe pour cela.
Ensuite il faut placer les démons des plugins dans des containers séparés également, pour aller au bout du concept…

Le cron c’est pas possible il appels des fichiers en cli donc compliqué quand c’est sur un autre docker.

Pour les démons c’est déjà en partie possible chez moi mosquitto est pas sur jeedom tout comme z2m

Du coup c’est pas en jeedom de prod ?
Ou tu as déporté tes clé sur un autre os ?

Si si c’est bien ma prod mais j’ai que du zigbee avec une clef en réseau ip

Virtualhere ?

Non non c’est une clef zigbee avec un esp32 qui discute sur le réseau ip

C’est possible d’appeler un cli dans un container depuis l’extérieur, et donc aussi depuis un autre docker, il suffit de partager la socket docker avec le container qui fait office de ‹ cron › (comme un volume -v /var/run/docker.sock:/var/run/docker.sock) c’est ce que j’ai fait et qui marche.
Ensuite il suffit de mettre des labels sur le container sur lequel tu veux exécuter le cron, par exemple pour jeedom j’ai mis juste ça en plus dans le docker-compose

    labels:
      # label chadburn for the "cron" container
      chadburn.enabled: "true"
      chadburn.job-exec.jeedom-cron.schedule: "@every 1m"
      chadburn.job-exec.jeedom-cron.command: "/usr/local/bin/php /var/www/html/core/php/jeeCron.php >> /var/www/html/log/cron.log 2>&1"

Ok dans ce cas effectivement par contre y’a un vrai intérêt à faire ça ?

Oui, l’intérêt c’est de rapprocher Jeedom d’une « simple » image apache+php qui est une image officielle, maintenue par la communauté.
Aujourd’hui l’image est une debian sur laquelle on ajoute tout un tas de packages (dont php apache et bien d’autre) mais on pourrait utiliser celle de php+apache qui permet d’ajouter les extensions spécifiques à php dont on a besoin.
J’ai essayé de le faire sur mon exemple https://github.com/pifou25/docker-jeedom/blob/master/build/Dockerfile mais pour l’instant j’en suis loin.

Après quelques occupations, je prends le temps de relancer mon projet de migration de Jeedom d’un Raspberry vers un container sur Synology.

@Loic : J’ai utilisé la conf que tu as partagé et l’ai modifié, de façon expérimentale :slight_smile: à partir du tuto de @Didier3L, pour y ajouter le support des ports USB et un réseau macvlan (pour plugin Xiaomi).
Je me prends une erreur d’accès SQL à l’étape d’installation de Jeedom :
« Installation of Jeedom
Installating database…ERROR SQLSTATE[HY000] [2002] Connection refused »

Je colle ci-dessous mon docker-compose, si l’un de vous a une idée de l’erreur que je fais avec celui-ci :

networks:
     default:
        name: mymacvlan
        driver: macvlan
        external: true
        
services:
  db:
    image: mariadb:latest
    command: 
      - "--default-authentication-plugin=mysql_native_password"
      - "--skip-name-resolve"
      - "--key_buffer_size=16M"
      - "--thread_cache_size=16"
      - "--tmp_table_size=48M"
      - "--max_heap_table_size=48M"
      - "--query_cache_type=1"
      - "--query_cache_size=32M"
      - "--query_cache_limit=2M"
      - "--query_cache_min_res_unit=3K"
      - "--innodb_flush_method=O_DIRECT"
      - "--innodb_flush_log_at_trx_commit=2"
      - "--innodb_log_file_size=32M"
      - "--innodb_large_prefix=on"
      - "--connect_timeout=600"
      - "--wait_timeout=600"
      - "--interactive_timeout=600"
    volumes:
      - /volume2/docker_nvme/jeedom/db:/var/lib/mysqll
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=MDP1
      - MYSQL_DATABASE=jeedom
      - MYSQL_USER=jeedom
      - MYSQL_PASSWORD=MDP2
    expose:
      - 3306
  http:
    image: jeedom/jeedom:4.4-http-bookworm
    volumes:
          - /volume2/docker_nvme/jeedom/html:/var/www/html
    tmpfs:
          - /tmp/jeedom
    devices:
             - /dev/ttyUSB0:/dev/ttyUSB0
             - /dev/ttyACM0:/dev/ttyACM0
             - /dev/ttyACM0:/dev/ttyACM1
             - /dev/net/tun
    ports:
          - 52080:80
    restart: always
    environment:
          - DB_HOST=db
          - DB_USERNAME=jeedom
          - DB_PASSWORD=MDP2
          - DB_NAME=jeedom
    cap_add:
             - SYS_PTRACE
             - SYS_ADMIN
             - NET_ADMIN
    healthcheck:
          test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:80"]
          interval: 30s
          timeout: 10s
          retries: 5
    depends_on:
          - db

Sachant que les MDP et username ne correspondent pas à des user/mdp gérés dans Synology.
Merci d’avance de votre aide

Hello,

Peux-tu vérifier dans le conteneur http (celui dont l’image est jeedom) si le fichier de config db est bien configuré (qu’il n’ait pas localhost comme lien pour la db): une commande de ce style si jamais, dans l’host

sudo docker compose exec http cat core/config/common.config.php
C’est ce fichier et tu dois avoir ‹ host › => ‹ db › car db est le nom du service mariadb dans ton yaml. Si ça c’est bon, port=3306, user et database = jeedom, password = MDP2 … tout va bien du côté jeedom.
Ensuilte on pourra vérifier que côté db il autorise bien les connexions extérieures, tu peux te connecter sur mariadb avec, par exemple un phpmyadmin ou adminer ? Tu peux par exemple ajouter un service adminer dans le docker-compose.yaml :

  adminer:
    image: adminer
    depends_on:
      - db
    logging:
      options:
        max-size: "10m"
        max-file: "1"
    restart: unless-stopped
    environment:
      - TZ=Europe/Paris
    ports:
      - 8080:8080

ps: pense à ajouter les options de logging dans les autres services aussi, ça permet de limiter la quantité de log générée par les containers…

Hello,

Merci pour ta réponse !
J’ai ajouté adminer (et les options de logging dans tous les services :slight_smile: ) et relancé le docker-compose (après avoir bien nettoyé les précédentes installations).

Je te confirme que le fichier common.config.php de Jeedom est OK.
J’ai bien host = db, port = 3306, user et database = jeedom, password = MDP2.
Le problème pourrait donc venir de la db ? (le dossier db est vide, je ne sais pas si c’est normal)

J’accède bien à db via adminer.
J’ai ces bases :
image

Celle de Jeedom semble vide :

Aurais-tu une idée de ce que je pourrais tester en suivant pour résoudre mon soucis ?
Je me demande si cela ne vient pas du fait les containers soient sur un réseau macvlan…

PS : désolé si je patauge un peu, mais je ne suis pas du tout informaticien, je fais de l’empirique en me baladant sur des sites et forums à chaque nouvelle étape (création de container, utilisation d’adminer…) :slight_smile: