diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 57f761a..3211043 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,40 +1,52 @@ name: test on: - push: - branches: - - main - pull_request: + push: + branches: + - main + pull_request: permissions: - contents: read + contents: read jobs: - check-update: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v5 - - - name: Test the update was run, files will differ if not - run: | - ./update.sh - git diff --exit-code - - - name: Display error message on failure - if: failure() # This condition ensures the step runs only if the previous step failed - run: echo "The diff after running the update.sh shows that the update.sh was not run before committing the PR." - - check-build: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v5 - - env: - DOLI_INSTALL_AUTO: 0 - run: | - # Regenerate all the image files - ./update.sh - # Try to build the image inimages/develop - docker build -t dolibarr/dolibarr:develop images/develop - docker run -d -p 127.0.0.1:80:80 --name dolibarr dolibarr/dolibarr:develop - docker ps | grep -q dolibarr + check-update: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v5 + + - name: Test the update was run, files will differ if not + run: | + ./update.sh + git diff --exit-code + + - name: Display error message on failure + if: failure() # This condition ensures the step runs only if the previous step failed + run: echo "The diff after running the update.sh shows that the update.sh was not run before committing the PR." + + check-script: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v5 + + - name: Run sh-checker + uses: luizm/action-sh-checker@v0.9.0 + with: + sh_checker_exclude: "examples" + + check-build: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v5 + - env: + DOLI_INSTALL_AUTO: 0 + run: | + # Regenerate all the image files + ./update.sh + # Try to build the image inimages/develop + docker build -t dolibarr/dolibarr:develop images/develop + docker run -d -p 127.0.0.1:80:80 --name dolibarr dolibarr/dolibarr:develop + docker ps | grep -q dolibarr diff --git a/README.md b/README.md index 5d9349a..b39bbfc 100644 --- a/README.md +++ b/README.md @@ -2,32 +2,37 @@ Docker image for Dolibarr ERP & CRM Open source web suite. -Dolibarr is a modern software package to manage your organization's activity (contacts, quotes, invoices, orders, stocks, agenda, hr, expense reports, accountancy, ecm, manufacturing, ...). +Dolibarr is a modern software package to manage your organization's activity (contacts, quotes, invoices, orders, +stocks, agenda, hr, expense reports, accountancy, ecm, manufacturing, ...). > [More information](https://github.com/dolibarr/dolibarr) - ## Available versions/tags on Docker See https://hub.docker.com/r/dolibarr/dolibarr/tags -*Very old Dolibarr versions may not be updated on docker hub, but you can always get them as standard zip package from Dolibarr official web site* - +*Very old Dolibarr versions may not be updated on docker hub, but you can always get them as standard zip package from +Dolibarr official web site* ## Supported architectures Linux x86-64 (`amd64`) and ARMv8 64-bit (`arm64v8`). - ## How to run this image ? -This image is based on the [official PHP repository](https://hub.docker.com/_/php/) and the [official Dolibarr repository](https://github.com/Dolibarr/dolibarr). It is build -using the tools saved in the [Dolibarr docker build repository](https://github.com/Dolibarr/dolibarr-docker). +This image is based on the [official PHP repository](https://hub.docker.com/_/php/) and +the [official Dolibarr repository](https://github.com/Dolibarr/dolibarr). It is build +using the tools saved in the [Dolibarr docker build repository](https://github.com/Dolibarr/dolibarr-docker). -This image does not contains database, so you need to link it with a database container. Let's see how to use [Docker Compose](https://docs.docker.com/compose/) to integrate it with [MariaDB](https://hub.docker.com/_/mariadb/) (you can also use [MySQL](https://hub.docker.com/_/mysql/) if you prefer): +This image does not contains database, so you need to link it with a database container. Let's see how to +use [Docker Compose](https://docs.docker.com/compose/) to integrate it +with [MariaDB](https://hub.docker.com/_/mariadb/) (you can also use [MySQL](https://hub.docker.com/_/mysql/) if you +prefer): If you want to have a persistent database and Dolibarr data files after a reboot or upgrade, you must first -create the directories `/home/dolibarr_mariadb`, `/home/dolibarr_documents` and `/home/dolibarr_custom` on your host to store persistent files, respectively, of the database, of the Dolibarr document files and of the installed external Dolibarr modules. +create the directories `/home/dolibarr_mariadb`, `/home/dolibarr_documents` and `/home/dolibarr_custom` on your host to +store persistent files, respectively, of the database, of the Dolibarr document files and of the installed external +Dolibarr modules. `mkdir /home/dolibarr_mariadb /home/dolibarr_documents /home/dolibarr_custom;` @@ -39,45 +44,45 @@ Then, create a `docker-compose.yml` file as following: # docker-compose logs services: - mariadb: - image: mariadb:latest - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} - MYSQL_DATABASE: ${MYSQL_DATABASE:-dolidb} - MYSQL_USER: ${MYSQL_USER:-dolidbuser} - MYSQL_PASSWORD: ${MYSQL_PASSWORD:-dolidbpass} - - volumes: - - /home/dolibarr_mariadb:/var/lib/mysql - - web: - # Choose the version of image to install - # dolibarr/dolibarr:latest (the latest stable version) - # dolibarr/dolibarr:develop - # dolibarr/dolibarr:x.y.z - image: dolibarr/dolibarr:latest - environment: - DOLI_INIT_DEMO: ${DOLI_INIT_DEMO:-0} - DOLI_DB_HOST: ${DOLI_DB_HOST:-mariadb} - DOLI_DB_NAME: ${DOLI_DB_NAME:-dolidb} - DOLI_DB_USER: ${DOLI_DB_USER:-dolidbuser} - DOLI_DB_PASSWORD: ${DOLI_DB_PASSWORD:-dolidbpass} - DOLI_URL_ROOT: "${DOLI_URL_ROOT:-http://0.0.0.0}" - DOLI_ADMIN_LOGIN: "${DOLI_ADMIN_LOGIN:-admin}" - DOLI_ADMIN_PASSWORD: "${DOLI_ADMIN_PASSWORD:-admin}" - DOLI_CRON: ${DOLI_CRON:-0} - DOLI_CRON_KEY: ${DOLI_CRON_KEY:-mycronsecurekey} - DOLI_COMPANY_NAME: ${DOLI_COMPANY_NAME:-MyBigCompany} - WWW_USER_ID: ${WWW_USER_ID:-1000} - WWW_GROUP_ID: ${WWW_GROUP_ID:-1000} - - ports: - - "80:80" - links: - - mariadb - volumes: - - /home/dolibarr_documents:/var/www/documents - - /home/dolibarr_custom:/var/www/html/custom + mariadb: + image: mariadb:latest + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} + MYSQL_DATABASE: ${MYSQL_DATABASE:-dolidb} + MYSQL_USER: ${MYSQL_USER:-dolidbuser} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:-dolidbpass} + + volumes: + - /home/dolibarr_mariadb:/var/lib/mysql + + web: + # Choose the version of image to install + # dolibarr/dolibarr:latest (the latest stable version) + # dolibarr/dolibarr:develop + # dolibarr/dolibarr:x.y.z + image: dolibarr/dolibarr:latest + environment: + DOLI_INIT_DEMO: ${DOLI_INIT_DEMO:-0} + DOLI_DB_HOST: ${DOLI_DB_HOST:-mariadb} + DOLI_DB_NAME: ${DOLI_DB_NAME:-dolidb} + DOLI_DB_USER: ${DOLI_DB_USER:-dolidbuser} + DOLI_DB_PASSWORD: ${DOLI_DB_PASSWORD:-dolidbpass} + DOLI_URL_ROOT: "${DOLI_URL_ROOT:-http://0.0.0.0}" + DOLI_ADMIN_LOGIN: "${DOLI_ADMIN_LOGIN:-admin}" + DOLI_ADMIN_PASSWORD: "${DOLI_ADMIN_PASSWORD:-admin}" + DOLI_CRON: ${DOLI_CRON:-0} + DOLI_CRON_KEY: ${DOLI_CRON_KEY:-mycronsecurekey} + DOLI_COMPANY_NAME: ${DOLI_COMPANY_NAME:-MyBigCompany} + WWW_USER_ID: ${WWW_USER_ID:-1000} + WWW_GROUP_ID: ${WWW_GROUP_ID:-1000} + + ports: + - "80:80" + links: + - mariadb + volumes: + - /home/dolibarr_documents:/var/www/documents + - /home/dolibarr_custom:/var/www/html/custom ``` Then build and run all services (-d is to run in background). @@ -92,25 +97,28 @@ You can verify that the web and the mariadb containers are up and see logs with `sudo docker-compose logs` -Once the log shows that the start is complete (you should see a message "You can connect to your Dolibarr web application..."), go to http://0.0.0.0 to access to the new Dolibarr installation, first admin login is admin/admin (if you did not change default value previously in the docker-compose.yml file). +Once the log shows that the start is complete (you should see a message "You can connect to your Dolibarr web +application..."), go to http://0.0.0.0 to access to the new Dolibarr installation, first admin login is admin/admin (if +you did not change default value previously in the docker-compose.yml file). -Note: If the host port 80 is already used, you can replace "80:80" with "xx:80" where xx is a free port number on the host. You will be +Note: If the host port 80 is already used, you can replace "80:80" with "xx:80" where xx is a free port number on the +host. You will be able to access the Dolibarr using the URL http://0.0.0.0:xx - Other examples: You can find other examples of docker-compose.yml file for enhanced use in the `examples` directory, such as: - - [Running Dolibarr with the cron (for Scheduled Tasks module)](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-cron/) - - [Running Dolibarr with a letsencrypt certificate](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-certbot/) - - [Running Dolibarr with a mysql server](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-mysql/) - - [Running Dolibarr with a Traefik reverse proxy](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-rp-traefik/) - - [Running Dolibarr with secrets](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-secrets/) +- [Running Dolibarr with the cron (for Scheduled Tasks module)](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-cron/) +- [Running Dolibarr with a letsencrypt certificate](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-certbot/) +- [Running Dolibarr with a mysql server](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-mysql/) +- [Running Dolibarr with a Traefik reverse proxy](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-rp-traefik/) +- [Running Dolibarr with secrets](https://github.com/Dolibarr/dolibarr-docker/tree/main/examples/with-secrets/) ## Upgrading Dolibarr version and migrating DB -Warning: Only data stored into the persistent directories (see the section "volumes" of your docker-compose.yml) will not be lost after an upgrade of containers. +Warning: Only data stored into the persistent directories (see the section "volumes" of your docker-compose.yml) will +not be lost after an upgrade of containers. Remove the `install.lock` file located inside the container volume `/var/www/documents` using one of this method: @@ -126,7 +134,6 @@ or if the document directory has been set as a persistent directory, you can do `rm -f /home/dolibarr_documents/install.lock` - Then download the updated version of containers and restart them. `sudo docker-compose pull` @@ -135,56 +142,58 @@ Then download the updated version of containers and restart them. `sudo docker-compose logs` -Ensure that env `DOLI_INSTALL_AUTO` in your docker-compose.yml is set to `1` so it will migrate the Database to the new version, or +Ensure that env `DOLI_INSTALL_AUTO` in your docker-compose.yml is set to `1` so it will migrate the Database to the new +version, or you can prefer to use the standard way to upgrade Dolibarr through the web interface by calling the /install page. - ## Environment variables summary You can use the following variables for a better customization of your docker-compose file. -| Variable | Default value | Description | -| ------------------------------- | ------------------------------ | ----------- | -| **DOLI_INSTALL_AUTO** | *1* | 1: The installation will be done during docker first boot -| **DOLI_INIT_DEMO** | *0* | 1: The installation will also load demo data during docker first boot -| **DOLI_PROD** | *1* | 1: Dolibarr will be run in production mode -| **DOLI_INSTANCE_UNIQUE_ID** | | Secret ID used as a salt / key for some encryption. By default, it is set randomly when the docker container is created. -| **DOLI_DB_TYPE** | *mysqli* | Type of the DB server (**mysqli**, pgsql) -| **DOLI_DB_HOST** | *mariadb* | Host name of the MariaDB/MySQL server -| **DOLI_DB_HOST_PORT** | *3306* | Host port of the MariaDB/MySQL server -| **DOLI_DB_NAME** | *dolidb* | Database name -| **DOLI_DB_USER** | *dolidbuser* | Database user -| **DOLI_DB_PASSWORD** | *dolidbpass* | Database user's password -| **DOLI_DB_SSL** | *false* | Enable encrypted database connections (MySQL and Dolibarr >v19 required) -| **DOLI_URL_ROOT** | *http://localhost* | Url root of the Dolibarr installation -| **DOLI_ADMIN_LOGIN** | *admin* | Admin's login created on the first boot -| **DOLI_ADMIN_PASSWORD** | *admin* | Admin's initial password created on the first boot -| **DOLI_ENABLE_MODULES** | | Comma-separated list of modules to be activated at install. modUser will always be activated. (Ex: `Societe,Facture,Stock`). Modules can't be activated correctly if DOLI_COMPANY_NAME and DOLI_COMPANY_COUNTRYCODE are not set -| **DOLI_COMPANY_NAME** | | Set the company name of Dolibarr at container init -| **DOLI_COMPANY_COUNTRYCODE** | | Set the company and Dolibarr country at container init. Need 2-letter codes like "FR", "GB", "US",... -| **DOLI_AUTH** | *dolibarr* | Which method is used to connect users, change to `ldap` or `ldap, dolibarr` to use LDAP -| **DOLI_LDAP_HOST** | *127.0.0.1* | The host of the LDAP server -| **DOLI_LDAP_PORT** | *389* | The port of the LDAP server -| **DOLI_LDAP_VERSION** | *3* | The version of LDAP to use -| **DOLI_LDAP_SERVER_TYPE** | *openldap* | The type of LDAP server (openLDAP, Active Directory, eGroupWare) -| **DOLI_LDAP_LOGIN_ATTRIBUTE** | *uid* | The attribute used to bind users -| **DOLI_LDAP_DN** | *ou=users,dc=my-domain,dc=com* | The base where to look for users -| **DOLI_LDAP_FILTER** | | The filter to authorise users to connect -| **DOLI_LDAP_BIND_DN** | | The complete DN of the user with read access on users -| **DOLI_LDAP_BIND_PASS** | | The password of the bind user -| **DOLI_LDAP_DEBUG** | *false* | Activate debug mode -| **DOLI_CRON** | *0* | 1: Enable cron service -| **DOLI_CRON_KEY** | | Security key to launch cron jobs -| **DOLI_CRON_USER** | | Dolibarr user used to launch cron jobs (will use firstadmin if not defined) -| **WWW_USER_ID** | | ID of user www-data. ID will not changed if leave empty. During a development, it is very practical to put the same ID as the host user. -| **WWW_GROUP_ID** | | ID of group www-data. ID will not changed if leave empty. -| **PHP_INI_DATE_TIMEZONE** | *UTC* | Default timezone on PHP -| **PHP_INI_MEMORY_LIMIT** | *256M* | PHP Memory limit -| **PHP_INI_UPLOAD_MAX_FILESIZE** | *2M* | PHP Maximum allowed size for uploaded files -| **PHP_INI_POST_MAX_SIZE** | *8M* | PHP Maximum size of POST data that PHP will accept. -| **PHP_INI_ALLOW_URL_FOPEN** | *0* | Allow URL-aware fopen wrappers - -Some environment variables are compatible with docker secrets behaviour, just add the `_FILE` suffix to var name and point the value file to read. +| Variable | Default value | Description | +|-------------------------------------|--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **DOLI_INSTALL_AUTO** | *1* | 1: The installation will be done during docker first boot | +| **DOLI_INIT_DEMO** | *0* | 1: The installation will also load demo data during docker first boot | +| **DOLI_PROD** | *1* | 1: Dolibarr will be run in production mode | +| **DOLI_INSTANCE_UNIQUE_ID** | | Secret ID used as a salt / key for some encryption. By default, it is set randomly when the docker container is created. | +| **DOLI_REQUIRE_INSTANCE_UNIQUE_ID** | *0* | 1: Enforce presence of **DOLI_INSTANCE_UNIQUE_ID** environment variable, failing container startup is absent | +| **DOLI_DB_TYPE** | *mysqli* | Type of the DB server (**mysqli**, pgsql) | +| **DOLI_DB_HOST** | *mariadb* | Host name of the MariaDB/MySQL server | +| **DOLI_DB_HOST_PORT** | *3306* | Host port of the MariaDB/MySQL server | +| **DOLI_DB_NAME** | *dolidb* | Database name | +| **DOLI_DB_USER** | *dolidbuser* | Database user | +| **DOLI_DB_PASSWORD** | *dolidbpass* | Database user's password | +| **DOLI_DB_SSL** | *false* | Enable encrypted database connections (MySQL and Dolibarr >v19 required) | +| **DOLI_URL_ROOT** | *http://localhost* | Url root of the Dolibarr installation | +| **DOLI_ADMIN_LOGIN** | *admin* | Admin's login created on the first boot | +| **DOLI_ADMIN_PASSWORD** | *admin* | Admin's initial password created on the first boot | +| **DOLI_ENABLE_MODULES** | | Comma-separated list of modules to be activated at install. modUser will always be activated. (Ex: `Societe,Facture,Stock`). Modules can't be activated correctly if DOLI_COMPANY_NAME and DOLI_COMPANY_COUNTRYCODE are not set | +| **DOLI_COMPANY_NAME** | | Set the company name of Dolibarr at container init | +| **DOLI_COMPANY_COUNTRYCODE** | | Set the company and Dolibarr country at container init. Need 2-letter codes like "FR", "GB", "US",... | +| **DOLI_AUTH** | *dolibarr* | Which method is used to connect users, change to `ldap` or `ldap, dolibarr` to use LDAP | +| **DOLI_LDAP_HOST** | *127.0.0.1* | The host of the LDAP server | +| **DOLI_LDAP_PORT** | *389* | The port of the LDAP server | +| **DOLI_LDAP_VERSION** | *3* | The version of LDAP to use | +| **DOLI_LDAP_SERVER_TYPE** | *openldap* | The type of LDAP server (openLDAP, Active Directory, eGroupWare) | +| **DOLI_LDAP_LOGIN_ATTRIBUTE** | *uid* | The attribute used to bind users | +| **DOLI_LDAP_DN** | *ou=users,dc=my-domain,dc=com* | The base where to look for users | +| **DOLI_LDAP_FILTER** | | The filter to authorise users to connect | +| **DOLI_LDAP_BIND_DN** | | The complete DN of the user with read access on users | +| **DOLI_LDAP_BIND_PASS** | | The password of the bind user | +| **DOLI_LDAP_DEBUG** | *false* | Activate debug mode | +| **DOLI_CRON** | *0* | 1: Enable cron service | +| **DOLI_CRON_KEY** | | Security key to launch cron jobs | +| **DOLI_CRON_USER** | | Dolibarr user used to launch cron jobs (will use firstadmin if not defined) | +| **WWW_USER_ID** | | ID of user www-data. ID will not changed if leave empty. During a development, it is very practical to put the same ID as the host user. | +| **WWW_GROUP_ID** | | ID of group www-data. ID will not changed if leave empty. | +| **PHP_INI_DATE_TIMEZONE** | *UTC* | Default timezone on PHP | +| **PHP_INI_MEMORY_LIMIT** | *256M* | PHP Memory limit | +| **PHP_INI_UPLOAD_MAX_FILESIZE** | *2M* | PHP Maximum allowed size for uploaded files | +| **PHP_INI_POST_MAX_SIZE** | *8M* | PHP Maximum size of POST data that PHP will accept. | +| **PHP_INI_ALLOW_URL_FOPEN** | *0* | Allow URL-aware fopen wrappers | + +Some environment variables are compatible with docker secrets behaviour, just add the `_FILE` suffix to var name and +point the value file to read. Environment variables that are compatible with docker secrets: * `DOLI_INSTANCE_UNIQUE_ID` => `DOLI_INSTANCE_UNIQUE_ID_FILE` @@ -195,15 +204,15 @@ Environment variables that are compatible with docker secrets: * `DOLI_CRON_KEY` => `DOLI_CRON_KEY_FILE` * `DOLI_CRON_USER` => `DOLI_CRON_USER_FILE` - - ## Advanced setup ### Add post-deployment and before starting scripts -It is possible to execute `*.sh`, `*.sql` and/or `*.php` custom files at the end of a deployment or before starting Apache by mounting volumes. +It is possible to execute `*.sh`, `*.sql` and/or `*.php` custom files at the end of a deployment or before starting +Apache by mounting volumes. For scripts to execute during deployment, mount volume in `/var/www/scripts/docker-init.d`. For scripts to execute before Apache start, mount volume in `/var/www/scripts/before-starting.d`. + ``` \docker-init.d |- custom_script.sql @@ -211,53 +220,54 @@ For scripts to execute before Apache start, mount volume in `/var/www/scripts/be |- custom_script.sh ``` -Mount the volumes with compose file : +Mount the volumes with compose file : ```yaml services: - mariadb: - image: mariadb:latest - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} - MYSQL_DATABASE: ${MYSQL_DATABASE:-dolidb} - MYSQL_USER: ${MYSQL_USER:-dolidbuser} - MYSQL_PASSWORD: ${MYSQL_PASSWORD:-dolidbpass} - - web: - # Choose the version of image to install - # dolibarr/dolibarr:latest (the latest stable version) - # dolibarr/dolibarr:develop - # dolibarr/dolibarr:x.y.z - image: dolibarr/dolibarr - environment: - DOLI_INIT_DEMO: ${DOLI_INIT_DEMO:-0} - DOLI_DB_HOST: ${DOLI_DB_HOST:-mariadb} - DOLI_DB_NAME: ${DOLI_DB_NAME:-dolidb} - DOLI_DB_USER: ${DOLI_DB_USER:-dolidbuser} - DOLI_DB_PASSWORD: ${DOLI_DB_PASSWORD:-dolidbpass} - DOLI_URL_ROOT: "${DOLI_URL_ROOT:-http://0.0.0.0}" - DOLI_ADMIN_LOGIN: "${DOLI_ADMIN_LOGIN:-admin}" - DOLI_ADMIN_PASSWORD: "${DOLI_ADMIN_PASSWORD:-admin}" - DOLI_CRON: ${DOLI_CRON:-0} - DOLI_CRON_KEY: ${DOLI_CRON_KEY:-mycronsecurekey} - WWW_USER_ID: ${WWW_USER_ID:-1000} - WWW_GROUP_ID: ${WWW_GROUP_ID:-1000} - volumes : - - volume-scripts:/var/www/scripts/docker-init.d - - before-starting-scripts:/var/www/scripts/before-starting.d - ports: - - "80:80" - links: - - mariadb + mariadb: + image: mariadb:latest + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} + MYSQL_DATABASE: ${MYSQL_DATABASE:-dolidb} + MYSQL_USER: ${MYSQL_USER:-dolidbuser} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:-dolidbpass} + + web: + # Choose the version of image to install + # dolibarr/dolibarr:latest (the latest stable version) + # dolibarr/dolibarr:develop + # dolibarr/dolibarr:x.y.z + image: dolibarr/dolibarr + environment: + DOLI_INIT_DEMO: ${DOLI_INIT_DEMO:-0} + DOLI_DB_HOST: ${DOLI_DB_HOST:-mariadb} + DOLI_DB_NAME: ${DOLI_DB_NAME:-dolidb} + DOLI_DB_USER: ${DOLI_DB_USER:-dolidbuser} + DOLI_DB_PASSWORD: ${DOLI_DB_PASSWORD:-dolidbpass} + DOLI_URL_ROOT: "${DOLI_URL_ROOT:-http://0.0.0.0}" + DOLI_ADMIN_LOGIN: "${DOLI_ADMIN_LOGIN:-admin}" + DOLI_ADMIN_PASSWORD: "${DOLI_ADMIN_PASSWORD:-admin}" + DOLI_CRON: ${DOLI_CRON:-0} + DOLI_CRON_KEY: ${DOLI_CRON_KEY:-mycronsecurekey} + WWW_USER_ID: ${WWW_USER_ID:-1000} + WWW_GROUP_ID: ${WWW_GROUP_ID:-1000} + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 + volumes: + - volume-scripts:/var/www/scripts/docker-init.d + - before-starting-scripts:/var/www/scripts/before-starting.d + ports: + - "80:80" + links: + - mariadb ``` - ### Tuning the apache configuration to suit you #### ServerName If you run apache2ctl configtest inside the container you'll probably get a message like this: -> AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using x.y.z.w Set the 'ServerName' directive globally to suppress this message +> AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using x.y.z.w Set the ' +> ServerName' directive globally to suppress this message Easy fix, create a single text file @@ -265,11 +275,12 @@ Contents: "ServerName dolibarr.example.com" Mountpoint: "/etc/apache2/conf-enabled/servername.conf" -read-only: Yes, mount it read only with :ro +read-only: Yes, mount it read only with :ro #### Running your dolibarr behind a proxy? -If you want Dolibarr or the logs from the dolibarr container to reveal the original IP address and not just the proxy's IP address you should create 2 text files: +If you want Dolibarr or the logs from the dolibarr container to reveal the original IP address and not just the proxy's +IP address you should create 2 text files: *remoteip.load* This file will load the apache module remoteip https://httpd.apache.org/docs/current/mod/mod_remoteip.html @@ -278,32 +289,38 @@ Contents: "LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so" Mountpoint: "/etc/apache2/mods-enabled/remoteip.load" -read-only: Yes, mount it read only with :ro +read-only: Yes, mount it read only with :ro *remoteip.conf* -This file will contain the configuration for remoteip and should also be bind mounted read-only inside the container. Content will depend on your proxy and which kind of header it uses. You may perhaps also enable the proxy protocol, read more at https://httpd.apache.org/docs/current/mod/mod_remoteip.html +This file will contain the configuration for remoteip and should also be bind mounted read-only inside the container. +Content will depend on your proxy and which kind of header it uses. You may perhaps also enable the proxy protocol, read +more at https://httpd.apache.org/docs/current/mod/mod_remoteip.html Example content: "RemoteIPHeader X-Forwarded-For" Mountpoint: "/etc/apache2/mods-enabled/remoteip.conf" - ### Support for PostgreSQL Setting `DOLI_DB_TYPE` to `pgsql` enable Dolibarr to run with a PostgreSQL database. When set to use `pgsql`, Dolibarr must be installed manually on it's first execution: - - Browse to `http://0.0.0.0/install`; - - Follow the installation setup; - - Add `install.lock` inside the container volume `/var/www/html/documents` (ex `docker-compose exec services-data_dolibarr_1 /bin/bash -c "touch /var/www/html/documents/install.lock"`). + +- Browse to `http://0.0.0.0/install`; +- Follow the installation setup; +- Add `install.lock` inside the container volume `/var/www/html/documents` (ex + `docker-compose exec services-data_dolibarr_1 /bin/bash -c "touch /var/www/html/documents/install.lock"`). When setup this way, to upgrade version the use of the web interface is mandatory: - - Remove the `install.lock` file (ex `docker-compose exec services-data_dolibarr_1 /bin/bash -c "rm -f /var/www/html/documents/install.lock"`). - - Browse to `http://0.0.0.0/install`; - - Upgrade DB; - - Add `install.lock` inside the container volume `/var/www/html/documents` (ex `docker-compose exec services-data_dolibarr_1 /bin/bash -c "touch /var/www/html/documents/install.lock"`). - -## Trouble shooting +- Remove the `install.lock` file (ex + `docker-compose exec services-data_dolibarr_1 /bin/bash -c "rm -f /var/www/html/documents/install.lock"`). +- Browse to `http://0.0.0.0/install`; +- Upgrade DB; +- Add `install.lock` inside the container volume `/var/www/html/documents` (ex + `docker-compose exec services-data_dolibarr_1 /bin/bash -c "touch /var/www/html/documents/install.lock"`). + +## Troubleshooting -If you get error "urllib3.exceptions.URLSchemeUnknown: Not supported URL scheme http+docker" during docker-compose, try to upgrade or downgrade the pip package: +If you get error "urllib3.exceptions.URLSchemeUnknown: Not supported URL scheme http+docker" during docker-compose, try +to upgrade or downgrade the pip package: pip install requests==2.31.0 diff --git a/docker-compose.yml b/docker-compose.yml index 44be222..7b58824 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -56,7 +56,7 @@ services: DOLI_ADMIN_LOGIN: admintest DOLI_ADMIN_PASSWORD: admintest DOLI_URL_ROOT: http://0.0.0.0:81 - DOLI_INSTANCE_UNIQUE_ID: myinstanceuniqueid + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 DOLI_CRON: 1 DOLI_CRON_KEY: mycronsecurekey DOLI_CRON_USER: admintest diff --git a/docker-run.sh b/docker-run.sh index a00a652..b22d78f 100755 --- a/docker-run.sh +++ b/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/examples/with-certbot/docker-compose.yml b/examples/with-certbot/docker-compose.yml index 58432e7..2fbe621 100644 --- a/examples/with-certbot/docker-compose.yml +++ b/examples/with-certbot/docker-compose.yml @@ -26,6 +26,7 @@ services: DOLI_DB_HOST_PORT: ${DB_PORT} DOLI_DB_NAME: ${DB_NAME} DOLI_URL_ROOT: ${SITE_URL} + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 PHP_INI_DATE_TIMEZONE: 'Europe/Paris' ports: - "8181:80" diff --git a/examples/with-cron/docker-compose.yml b/examples/with-cron/docker-compose.yml index 0355d14..c1e38fd 100644 --- a/examples/with-cron/docker-compose.yml +++ b/examples/with-cron/docker-compose.yml @@ -79,6 +79,7 @@ services: DOLI_CRON_KEY: ${DOLI_CRON_KEY:-mycronsecurekey} DOLI_INIT_DEMO: ${DOLI_INIT_DEMO:-0} DOLI_COMPANY_NAME: ${DOLI_COMPANY_NAME:-MyBigCompany} + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 ports: - 80:80 networks: @@ -105,5 +106,6 @@ services: DOLI_CRON_KEY: ${DOLI_CRON_KEY:-mycronsecurekey} DOLI_INIT_DEMO: ${DOLI_INIT_DEMO:-0} DOLI_COMPANY_NAME: ${DOLI_COMPANY_NAME:-MyBigCompany} + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 networks: - internal-pod diff --git a/examples/with-mysql/docker-compose.yml b/examples/with-mysql/docker-compose.yml index 69434bb..d1d3fb2 100644 --- a/examples/with-mysql/docker-compose.yml +++ b/examples/with-mysql/docker-compose.yml @@ -20,6 +20,7 @@ services: DOLI_DB_NAME: "dolibarr" DOLI_ADMIN_LOGIN: "admin" DOLI_ADMIN_PASSWORD: "mysuperhypersecretpasswordforadminacount" + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 ports: - 80:80 volumes: diff --git a/examples/with-pgsql/docker-compose.yml b/examples/with-pgsql/docker-compose.yml index 55449bf..473fb14 100644 --- a/examples/with-pgsql/docker-compose.yml +++ b/examples/with-pgsql/docker-compose.yml @@ -23,6 +23,7 @@ services: DOLI_DB_NAME: "dolibarr" DOLI_ADMIN_LOGIN: "admin" DOLI_ADMIN_PASSWORD: "mysuperhypersecretpasswordforadminacount" + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 ports: - 80:80 volumes: diff --git a/examples/with-rp-traefik/docker-compose.yml b/examples/with-rp-traefik/docker-compose.yml index 3fecd3b..3da908b 100644 --- a/examples/with-rp-traefik/docker-compose.yml +++ b/examples/with-rp-traefik/docker-compose.yml @@ -49,6 +49,7 @@ services: DOLI_DB_NAME: "dolibarr" DOLI_ADMIN_LOGIN: "admin" DOLI_ADMIN_PASSWORD: "mysuperhypersecretpasswordforadminacount" + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 labels: - "traefik.enable=true" - "traefik.http.routers.dolibarr.tls=true" diff --git a/examples/with-secrets/docker-compose.yml b/examples/with-secrets/docker-compose.yml index ac27ff6..fd9ae3f 100644 --- a/examples/with-secrets/docker-compose.yml +++ b/examples/with-secrets/docker-compose.yml @@ -34,6 +34,7 @@ services: DOLI_DB_PASSWORD_FILE: "/run/secrets/mysql-password" DOLI_ADMIN_LOGIN_FILE: "/run/secrets/dolibarr-admin-user" DOLI_ADMIN_PASSWORD_FILE: "/run/secrets/dolibarr-admin-password" + DOLI_REQUIRE_INSTANCE_UNIQUE_ID: 1 ports: - 80:80 volumes: diff --git a/images/15.0.3-php7.4/docker-run.sh b/images/15.0.3-php7.4/docker-run.sh index a00a652..b22d78f 100755 --- a/images/15.0.3-php7.4/docker-run.sh +++ b/images/15.0.3-php7.4/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/16.0.5-php8.1/docker-run.sh b/images/16.0.5-php8.1/docker-run.sh index a00a652..b22d78f 100755 --- a/images/16.0.5-php8.1/docker-run.sh +++ b/images/16.0.5-php8.1/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/17.0.4-php8.1/docker-run.sh b/images/17.0.4-php8.1/docker-run.sh index a00a652..b22d78f 100755 --- a/images/17.0.4-php8.1/docker-run.sh +++ b/images/17.0.4-php8.1/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/18.0.8-php8.1/docker-run.sh b/images/18.0.8-php8.1/docker-run.sh index a00a652..b22d78f 100755 --- a/images/18.0.8-php8.1/docker-run.sh +++ b/images/18.0.8-php8.1/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/19.0.4-php8.2/docker-run.sh b/images/19.0.4-php8.2/docker-run.sh index a00a652..b22d78f 100755 --- a/images/19.0.4-php8.2/docker-run.sh +++ b/images/19.0.4-php8.2/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/20.0.4-php8.2/docker-run.sh b/images/20.0.4-php8.2/docker-run.sh index a00a652..b22d78f 100755 --- a/images/20.0.4-php8.2/docker-run.sh +++ b/images/20.0.4-php8.2/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/21.0.4-php8.2/docker-run.sh b/images/21.0.4-php8.2/docker-run.sh index a00a652..b22d78f 100755 --- a/images/21.0.4-php8.2/docker-run.sh +++ b/images/21.0.4-php8.2/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/22.0.3-php8.2/docker-run.sh b/images/22.0.3-php8.2/docker-run.sh index a00a652..b22d78f 100755 --- a/images/22.0.3-php8.2/docker-run.sh +++ b/images/22.0.3-php8.2/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/images/develop/docker-run.sh b/images/develop/docker-run.sh index a00a652..b22d78f 100755 --- a/images/develop/docker-run.sh +++ b/images/develop/docker-run.sh @@ -1,4 +1,7 @@ #!/bin/bash + +# shellcheck disable=SC2129 + # This script is run when the Docker web container is started. # It is embedded into the Docker image of dolibarr/dolibarr. # @@ -19,26 +22,29 @@ function get_env_value() { local value="${defaultValue}" if [ "${!varName:-}" ]; then - value="${!varName}" + value="${!varName}" elif [ "${!fileVarName:-}" ]; then - value="$(< "${!fileVarName}")" + value="$(<"${!fileVarName}")" fi - echo ${value} + echo "${value}" exit 0 } - # Function to create directories, create conf.php file and set permissions on files -function initDolibarr() -{ - if [[ ! -d /var/www/documents ]]; then - echo "[INIT] => create volume directory /var/www/documents ..." - mkdir -p /var/www/documents - fi - - echo "[INIT] => update PHP Config ..." - cat > ${PHP_INI_DIR}/conf.d/dolibarr-php.ini << EOF +function initDolibarr() { + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} && "${DOLI_REQUIRE_INSTANCE_UNIQUE_ID:-0}" == "1" ]]; then + echo "[INIT] => please set DOLI_INSTANCE_UNIQUE_ID to a secure random string..." + exit 1 + fi + + if [[ ! -d /var/www/documents ]]; then + echo "[INIT] => create volume directory /var/www/documents ..." + mkdir -p /var/www/documents + fi + + echo "[INIT] => update PHP Config ..." + cat >"${PHP_INI_DIR}"/conf.d/dolibarr-php.ini < update Dolibarr Config ..." - mkdir /var/www/html/conf - cat > /var/www/html/conf/conf.php << EOF + if [[ ! -f /var/www/html/conf/conf.php ]]; then + echo "[INIT] => update Dolibarr Config ..." + mkdir /var/www/html/conf + cat >/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - else - echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >> /var/www/html/conf/conf.php - fi - - if [[ ! -z ${DOLI_INSTANCE_UNIQUE_ID} ]]; then - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >> /var/www/html/conf/conf.php - else - # It is better to have a generic value than no value - echo "[INIT] => update Dolibarr Config with instance unique id ..." - echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >> /var/www/html/conf/conf.php - fi - if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then - echo "[INIT] => update Dolibarr Config with LDAP entries ..." - cat >> /var/www/html/conf/conf.php << EOF + # Check if SSL is enabled for the database + if [[ "${DOLI_DB_SSL}" == "true" && "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_host='ssl://${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + else + echo "\$dolibarr_main_db_host='${DOLI_DB_HOST}';" >>/var/www/html/conf/conf.php + fi + + if [[ -n ${DOLI_INSTANCE_UNIQUE_ID} ]]; then + echo "[INIT] => update Dolibarr Config with provided instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='${DOLI_INSTANCE_UNIQUE_ID}';" >>/var/www/html/conf/conf.php + else + echo "[INIT] => update Dolibarr Config with default instance unique id ..." + echo "\$dolibarr_main_instance_unique_id='myinstanceuniquekey';" >>/var/www/html/conf/conf.php + fi + if [[ ${DOLI_AUTH} =~ .*ldap.* ]]; then + echo "[INIT] => update Dolibarr Config with LDAP entries ..." + cat >>/var/www/html/conf/conf.php <> /var/www/html/conf/conf.php - echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >> /var/www/html/conf/conf.php - fi - fi - - echo "[INIT] => update ownership for file in Dolibarr Config ..." - chown www-data:www-data /var/www/html/conf/conf.php - if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then - chmod 600 /var/www/html/conf/conf.php - else - chmod 400 /var/www/html/conf/conf.php - fi -} + fi + if [[ "${DOLI_DB_TYPE}" == "mysqli" ]]; then + echo "\$dolibarr_main_db_character_set='utf8mb4';" >>/var/www/html/conf/conf.php + echo "\$dolibarr_main_db_collation='utf8mb4_unicode_ci';" >>/var/www/html/conf/conf.php + fi + fi + echo "[INIT] => update ownership for file in Dolibarr Config ..." + chown www-data:www-data /var/www/html/conf/conf.php + if [[ "${DOLI_DB_TYPE}" == "pgsql" && ! -f /var/www/documents/install.lock ]]; then + chmod 600 /var/www/html/conf/conf.php + else + chmod 400 /var/www/html/conf/conf.php + fi +} # Wait that container database is running -function waitForDataBase() -{ - r=1 - - while [[ ${r} -ne 0 ]]; do - mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >> /var/www/documents/initdb.log 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - echo "Waiting that SQL database is up ..." - sleep 2 - fi - done -} +function waitForDataBase() { + r=1 + while [[ ${r} -ne 0 ]]; do + mysql -u "${DOLI_DB_USER}" --protocol tcp -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" --connect-timeout=5 -e "status" >>/var/www/documents/initdb.log 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + echo "Waiting that SQL database is up ..." + sleep 2 + fi + done +} # Lock any new upgrade -function lockInstallation() -{ - touch /var/www/documents/install.lock - chown www-data:www-data /var/www/documents/install.lock - chmod 400 /var/www/documents/install.lock +function lockInstallation() { + touch /var/www/documents/install.lock + chown www-data:www-data /var/www/documents/install.lock + chmod 400 /var/www/documents/install.lock } - # Run SQL files into /scripts directory. -function runScripts() -{ - if [ -d /var/www/scripts/$1 ] ; then - for file in /var/www/scripts/$1/*; do - [ ! -f $file ] && continue - - # If extension is not in PHP SQL SH, we loop - isExec=$(echo "PHP SQL SH" | grep -wio ${file##*.}) - [ -z "$isExec" ] && continue - - echo "Importing custom ${isExec} from `basename ${file}` ..." - echo "Importing custom ${isExec} from `basename ${file}` ..." >> /var/www/documents/initdb.log - if [ "$isExec" == "SQL" ] ; then - sed -i 's/^--.*//g;' ${file} - sed -i 's/__ENTITY__/1/g;' ${file} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${file} >> /var/www/documents/initdb.log 2>&1 - elif [ "$isExec" == "PHP" ] ; then - php $file - elif [ "$isExec" == "SH" ] ; then - /bin/bash $file - fi - done - fi +function runScripts() { + if [ -d /var/www/scripts/"$1" ]; then + for file in /var/www/scripts/"$1"/*; do + [ ! -f "$file" ] && continue + + # If extension is not in PHP SQL SH, we loop + isExec=$(echo "PHP SQL SH" | grep -wio "${file##*.}") + [ -z "$isExec" ] && continue + + echo "Importing custom ${isExec} from $(basename "${file}") ..." + echo "Importing custom ${isExec} from $(basename "${file}") ..." >>/var/www/documents/initdb.log + if [ "$isExec" == "SQL" ]; then + sed -i 's/^--.*//g;' "${file}" + sed -i 's/__ENTITY__/1/g;' "${file}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${file}" >>/var/www/documents/initdb.log 2>&1 + elif [ "$isExec" == "PHP" ]; then + php "$file" + elif [ "$isExec" == "SH" ]; then + /bin/bash "$file" + fi + done + fi } - # Function called to initialize the database (creation of database tables and init data) -function initializeDatabase() -{ - for fileSQL in /var/www/html/install/mysql/tables/*.sql; do - if [[ ${fileSQL} != *.key.sql ]]; then - echo "Importing table from `basename ${fileSQL}` ..." - echo "Importing table from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/--.*//g;' ${fileSQL} # remove all comment because comments into create sql crash the load - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - fi - done - - for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do - echo "Importing table key from `basename ${fileSQL}` ..." - echo "Importing table key from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/functions/*.sql; do - echo "Importing `basename ${fileSQL}` ..." - echo "Importing `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - for fileSQL in /var/www/html/install/mysql/data/*.sql; do - if [[ $fileSQL =~ llx_accounting_account_ ]]; then - echo "Do not import data from `basename ${fileSQL}` ..." - continue - fi - echo "Importing data from `basename ${fileSQL}` ..." - echo "Importing data from `basename ${fileSQL}` ..." >> /var/www/documents/initdb.log - sed -i 's/^--.*//g;' ${fileSQL} - sed -i 's/__ENTITY__/1/g;' ${fileSQL} - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done - - echo "Set some default const ..." - echo "Set some default const ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then - mkdir -p /var/www/dev/initdemo/ - - echo "DOLI_VERSION=$DOLI_VERSION" - - # Set DOLI_TAG to a number "x.y", even if value is "develop" - DOLI_TAG=${DOLI_VERSION} - if [ ${DOLI_TAG} == "develop" ]; then - echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" - DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" - fi - - # Convert version x.y.z into x.y.0 - versiondemo=`echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/"` # Convert vesion x.y.z into x.y.0 - - echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" - curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql - if [ $? -ne 0 ]; then - echo "ERROR: failed to get the online init demo file. No demo init will be done." - echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 - else - for fileSQL in /var/www/dev/initdemo/*.sql; do - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." - echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >> /var/www/documents/initdb.log - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >> /var/www/documents/initdb.log 2>&1 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >> /var/www/documents/initdb.log 2>&1 - - echo "Then we load demo data ${fileSQL} ..." - echo "Then we load demo data ${fileSQL} ..." >> /var/www/documents/initdb.log - sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' ${fileSQL} - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" - echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < ${fileSQL} >> /var/www/documents/initdb.log 2>&1 - done +function initializeDatabase() { + for fileSQL in /var/www/html/install/mysql/tables/*.sql; do + if [[ ${fileSQL} != *.key.sql ]]; then + echo "Importing table from $(basename "${fileSQL}") ..." + echo "Importing table from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/--.*//g;' "${fileSQL}" # remove all comment because comments into create sql crash the load + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + fi + done + + for fileSQL in /var/www/html/install/mysql/tables/*.key.sql; do + echo "Importing table key from $(basename "${fileSQL}") ..." + echo "Importing table key from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/functions/*.sql; do + echo "Importing $(basename "${fileSQL}") ..." + echo "Importing $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + for fileSQL in /var/www/html/install/mysql/data/*.sql; do + if [[ $fileSQL =~ llx_accounting_account_ ]]; then + echo "Do not import data from $(basename "${fileSQL}") ..." + continue + fi + echo "Importing data from $(basename "${fileSQL}") ..." + echo "Importing data from $(basename "${fileSQL}") ..." >>/var/www/documents/initdb.log + sed -i 's/^--.*//g;' "${fileSQL}" + sed -i 's/__ENTITY__/1/g;' "${fileSQL}" + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + + echo "Set some default const ..." + + echo "Set some default const ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_VERSION_LAST_INSTALL';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_NOT_INSTALLED';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_LANG_DEFAULT';" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_VERSION_LAST_INSTALL', '${DOLI_VERSION}', 'chaine', 0, 'Dolibarr version when install', 0);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_LANG_DEFAULT', 'auto', 'chaine', 0, 'Default language', 1);" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('SYSTEMTOOLS_MYSQLDUMP', '/usr/bin/mysqldump', 'chaine', 0, '', 0);" >>/var/www/documents/initdb.log 2>&1 + + if [[ ${DOLI_INIT_DEMO} -eq 1 ]]; then + mkdir -p /var/www/dev/initdemo/ + + echo "DOLI_VERSION=$DOLI_VERSION" + + # Set DOLI_TAG to a number "x.y", even if value is "develop" + DOLI_TAG=${DOLI_VERSION} + if [ "${DOLI_TAG}" == "develop" ]; then + echo "DOLI_TAG is develop that does not exists, so we will use the github demo file for version ${DOLI_VERSION_FOR_INIT_DEMO}" + DOLI_TAG="${DOLI_VERSION_FOR_INIT_DEMO}" + fi + + # Convert version x.y.z into x.y.0 + # shellcheck disable=SC2001 + versiondemo=$(echo "${DOLI_TAG}" | sed "s/^\([0-9]*\.[0-9]*\).*/\1.0/") # Convert version x.y.z into x.y.0 + + echo "Get demo data with: curl -fLSs -o /var/www/dev/initdemo/initdemo.sql https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + curl -fLSs -o /var/www/dev/initdemo/initdemo.sql "https://raw.githubusercontent.com/Dolibarr/dolibarr/${DOLI_TAG}/dev/initdemo/mysqldump_dolibarr_$versiondemo.sql" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "ERROR: failed to get the online init demo file. No demo init will be done." + echo "ERROR: failed to get the online init demo file. No demo init will be done." >>/var/www/documents/initdb.log 2>&1 + else + for fileSQL in /var/www/dev/initdemo/*.sql; do + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." + echo "Found demo data file, so we first drop tables llx_accounting_xxx ..." >>/var/www/documents/initdb.log + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_account\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_account" >>/var/www/documents/initdb.log 2>&1 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"DROP TABLE llx_accounting_system\"" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DROP TABLE llx_accounting_system" >>/var/www/documents/initdb.log 2>&1 + + echo "Then we load demo data ${fileSQL} ..." + echo "Then we load demo data ${fileSQL} ..." >>/var/www/documents/initdb.log + sed -i 's/\/\*!999999\\- enable the sandbox mode \*\///g;' "${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" + echo "mysql -u ${DOLI_DB_USER} -pxxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} < ${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" <"${fileSQL}" >>/var/www/documents/initdb.log 2>&1 + done + fi + else + echo "DOLI_INIT_DEMO is off. No demo data load to do." + echo "DOLI_INIT_DEMO is off. No demo data load to do." >>/var/www/documents/initdb.log fi - else - echo "DOLI_INIT_DEMO is off. No demo data load to do." - echo "DOLI_INIT_DEMO is off. No demo data load to do." >> /var/www/documents/initdb.log - fi - - echo "Create SuperAdmin account ..." - echo "Create SuperAdmin account ..." >> /var/www/documents/initdb.log - pass_crypted=`echo -n ${DOLI_ADMIN_PASSWORD} | md5sum | awk '{print $1}'` - # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const - #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 - #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 - - # Insert may fails if record already exists - echo "Try insert into llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >> /var/www/documents/initdb.log 2>&1 - # Insert may fails if record already exists - echo "Now do update llx_user ..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >> /var/www/documents/initdb.log 2>&1 - - echo "Enable user module ..." - echo "Enable user module ..." >> /var/www/documents/initdb.log - php /var/www/scripts/docker-init.php - - echo "Set cron key to ${DOLI_CRON_KEY}..." - echo "Set cron key to ${DOLI_CRON_KEY}..." >> /var/www/documents/initdb.log - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >> /var/www/documents/initdb.log 2>&1 - - # Run init scripts - echo "Run scripts into docker-init.d if there is ..." - echo "Run scripts into docker-init.d if there is ..." >> /var/www/documents/initdb.log - runScripts "docker-init.d" - - # Update ownership after initialisation of modules - chown -R www-data:www-data /var/www/documents -} + echo "Create SuperAdmin account ..." + echo "Create SuperAdmin account ..." >>/var/www/documents/initdb.log + pass_crypted=$(echo -n "${DOLI_ADMIN_PASSWORD}" | md5sum | awk '{print $1}') + # TODO Generate pass_crypted using PHP password_hash and set MAIN_SECURITY_HASH_ALGO=password_hash into llx_const + #pass_crypted2=`php -r "echo password_hash(${DOLI_ADMIN_PASSWORD}, PASSWORD_BCRYPT);"` + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "DELETE FROM llx_const WHERE name='MAIN_SECURITY_HASH_ALGO';" >> /var/www/documents/initdb.log 2>&1 + #mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_const(name,value,type,visible,note,entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);" >> /var/www/documents/initdb.log 2>&1 + + # Insert may fails if record already exists + echo "Try insert into llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "INSERT INTO llx_user (entity, login, pass_crypted, lastname, admin, statut) VALUES (0, '${DOLI_ADMIN_LOGIN}', '${pass_crypted}', 'SuperAdmin', 1, 1);" >>/var/www/documents/initdb.log 2>&1 + # Insert may fails if record already exists + echo "Now do update llx_user ..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_user SET pass_crypted = '${pass_crypted}' WHERE login = '${DOLI_ADMIN_LOGIN}';" >>/var/www/documents/initdb.log 2>&1 + + echo "Enable user module ..." + echo "Enable user module ..." >>/var/www/documents/initdb.log + php /var/www/scripts/docker-init.php + + echo "Set cron key to ${DOLI_CRON_KEY}..." + echo "Set cron key to ${DOLI_CRON_KEY}..." >>/var/www/documents/initdb.log + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "UPDATE llx_const set value = '${DOLI_CRON_KEY}' WHERE name = 'CRON_KEY'" >>/var/www/documents/initdb.log 2>&1 + + # Run init scripts + echo "Run scripts into docker-init.d if there is ..." + echo "Run scripts into docker-init.d if there is ..." >>/var/www/documents/initdb.log + runScripts "docker-init.d" + + # Update ownership after initialisation of modules + chown -R www-data:www-data /var/www/documents +} # Migrate database to the new version -function migrateDatabase() -{ - TARGET_VERSION="$(echo ${DOLI_VERSION} | cut -d. -f1).$(echo ${DOLI_VERSION} | cut -d. -f2).0" - echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." - - mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" > /var/www/documents/backup-before-upgrade.sql - r=${?} - if [[ ${r} -ne 0 ]]; then - echo "Dump failed ... Aborting migration ..." - return ${r} - fi - echo "Dump done ... Starting Migration ..." - - echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock - - > /var/www/documents/migration_error.html - pushd /var/www/htdocs/install > /dev/null - php upgrade.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php upgrade2.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 && \ - php step5.php ${INSTALLED_VERSION} ${TARGET_VERSION} >> /var/www/documents/migration_error.html 2>&1 - r=$? - popd > /dev/null - - echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" - rm -f /var/www/documents/upgrade.unlock - - if [[ ${r} -ne 0 ]]; then - echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" < /var/www/documents/backup-before-upgrade.sql - echo "DB Restored ..." - return ${r} - else - echo "Migration successful ... Enjoy !" - fi - - return 0 +function migrateDatabase() { + TARGET_VERSION="$(echo "${DOLI_VERSION}" | cut -d. -f1).$(echo "${DOLI_VERSION}" | cut -d. -f2).0" + echo "Dumping Database into /var/www/documents/backup-before-upgrade.sql ..." + + mysqldump -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" >/var/www/documents/backup-before-upgrade.sql + r=${?} + if [[ ${r} -ne 0 ]]; then + echo "Dump failed ... Aborting migration ..." + return ${r} + fi + echo "Dump done ... Starting Migration ..." + + echo "Create unlock file with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + + truncate -s 0 /var/www/documents/migration_error.html + pushd /var/www/htdocs/install >/dev/null + php upgrade.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php upgrade2.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 && + php step5.php "${INSTALLED_VERSION}" "${TARGET_VERSION}" >>/var/www/documents/migration_error.html 2>&1 + r=$? + popd >/dev/null + + echo "Remove unlock file with: rm -f /var/www/documents/upgrade.unlock" + rm -f /var/www/documents/upgrade.unlock + + if [[ ${r} -ne 0 ]]; then + echo "Migration failed ... Restoring DB ... check file /var/www/documents/migration_error.html for more info on error ..." + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" &1 -function run() -{ - > /var/www/documents/initdb.log 2>&1 - - initDolibarr - echo "Current Version of files is : ${DOLI_VERSION}" + initDolibarr + echo "Current Version of files is : ${DOLI_VERSION}" - # If install of mysql database (and not install of cron) is requested - if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then - echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" + # If install of mysql database (and not install of cron) is requested + if [[ ${DOLI_INSTALL_AUTO} -eq 1 && ${DOLI_CRON} -ne 1 && "${DOLI_DB_TYPE}" != "pgsql" ]]; then + echo "DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database" - waitForDataBase + waitForDataBase - # Check if DB exists (even if empty) - DB_EXISTS=0 - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '"${DOLI_DB_NAME}"';" > /tmp/docker-run-checkdb.result 2>&1 - r=$? - if [[ ${r} -eq 0 ]]; then - DB_EXISTS=`grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result` - fi - echo "DB Exists is : ${DB_EXISTS}" >> /var/www/documents/initdb.log 2>&1 - echo "DB Exists is : ${DB_EXISTS}" + # Check if DB exists (even if empty) + DB_EXISTS=0 + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} -e \"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';\" > /tmp/docker-run-checkdb.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '${DOLI_DB_NAME}';" >/tmp/docker-run-checkdb.result 2>&1 + r=$? + if [[ ${r} -eq 0 ]]; then + DB_EXISTS=$(grep "${DOLI_DB_NAME}" /tmp/docker-run-checkdb.result) + fi + echo "DB Exists is : ${DB_EXISTS}" >>/var/www/documents/initdb.log 2>&1 + echo "DB Exists is : ${DB_EXISTS}" + + if [[ ! -f /var/www/documents/install.lock ]]; then + echo "Install.lock Exists is : no" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : no" + else + echo "Install.lock Exists is : yes" >>/var/www/documents/initdb.log 2>&1 + echo "Install.lock Exists is : yes" + fi - if [[ ! -f /var/www/documents/install.lock ]]; then - echo "Install.lock Exists is : no" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : no" - else - echo "Install.lock Exists is : yes" >> /var/www/documents/initdb.log 2>&1 - echo "Install.lock Exists is : yes" - fi + # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. + if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + r=$? + if [[ ${r} -ne 0 ]]; then + # If test fails, it means tables does not exists, so we create them + echo "No table found, we launch initializeDatabase" >>/var/www/documents/initdb.log 2>&1 + echo "No table found, we launch initializeDatabase" + + initializeDatabase + + # Regenerate the /tmp/docker-run-lastinstall.result + echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >>/var/www/documents/initdb.log 2>&1 + mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" >/tmp/docker-run-lastinstall.result 2>&1 + fi - # If install.lock does not exists, or if db does not exists, we launch the initializeDatabase, then upgrade if required. - if [[ ! -f /var/www/documents/install.lock || "${DB_EXISTS}" = "" ]]; then - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - r=$? - if [[ ${r} -ne 0 ]]; then - # If test fails, it means tables does not exists, so we create them - echo "No table found, we launch initializeDatabase" >> /var/www/documents/initdb.log 2>&1 - echo "No table found, we launch initializeDatabase" - - initializeDatabase - - # Regenerate the /tmp/docker-run-lastinstall.result - echo "mysql -u ${DOLI_DB_USER} -pxxxxxx -h ${DOLI_DB_HOST} -P ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} -e \"SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1\" > /tmp/docker-run-lastinstall.result 2>&1" >> /var/www/documents/initdb.log 2>&1 - mysql -u "${DOLI_DB_USER}" -p"${DOLI_DB_PASSWORD}" -h "${DOLI_DB_HOST}" -P "${DOLI_DB_HOST_PORT}" "${DOLI_DB_NAME}" -e "SELECT Q.LAST_INSTALLED_VERSION FROM (SELECT INET_ATON(REPLACE(REPLACE(CONCAT(value, REPEAT('.0', 3 - CHAR_LENGTH(value) + CHAR_LENGTH(REPLACE(value, '.', '')))), '-beta', ''), '-alpha', '')) as VERSION_ATON, value as LAST_INSTALLED_VERSION FROM llx_const WHERE name IN ('MAIN_VERSION_LAST_INSTALL', 'MAIN_VERSION_LAST_UPGRADE') and entity=0) Q ORDER BY VERSION_ATON DESC LIMIT 1" > /tmp/docker-run-lastinstall.result 2>&1 - fi - - # Now database exists. Do we have to upgrade it ? - if [ -f /tmp/docker-run-lastinstall.result ]; then - INSTALLED_VERSION=`grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result` - echo "Database Version is : ${INSTALLED_VERSION}" - echo "Files Version are : ${DOLI_VERSION}" - - if [[ ${DOLI_VERSION} != "develop" ]]; then - # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f1)" ]]; then - echo "Database version is a major lower version, so we must run the upgrade process" - migrateDatabase - else - # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -lt "$(echo ${DOLI_VERSION} | cut -d. -f2)" ]]; then - echo "Database version is a middle lower version, so we must run the upgrade process" + # Now database exists. Do we have to upgrade it ? + if [ -f /tmp/docker-run-lastinstall.result ]; then + INSTALLED_VERSION=$(grep -v LAST_INSTALLED_VERSION /tmp/docker-run-lastinstall.result) + echo "Database Version is : ${INSTALLED_VERSION}" + echo "Files Version are : ${DOLI_VERSION}" + + if [[ ${DOLI_VERSION} != "develop" ]]; then + # Test if x in INSTALLED_VERSION is lower than X of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f1)" ]]; then + echo "Database version is a major lower version, so we must run the upgrade process" migrateDatabase else - # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) - if [[ "$(echo ${INSTALLED_VERSION} | cut -d. -f1)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f1)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f2)" -eq "$(echo ${DOLI_VERSION} | cut -d. -f2)" && "$(echo ${INSTALLED_VERSION} | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo ${DOLI_VERSION} | cut -d. -f3)" ]]; then - echo "Database version is a minor lower version, so we must run the upgrade process" + # Test if y in INSTALLED_VERSION is lower than Y of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f2)" ]]; then + echo "Database version is a middle lower version, so we must run the upgrade process" migrateDatabase else - echo "Schema update is not required ... Enjoy !" + # Test if z in INSTALLED_VERSION is lower than Z of DOLI_VERSION (in x.y.z) + if [[ "$(echo "${INSTALLED_VERSION}" | cut -d. -f1)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f1)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f2)" -eq "$(echo "${DOLI_VERSION}" | cut -d. -f2)" && "$(echo "${INSTALLED_VERSION}" | cut -d. -f3 | sed -e 's/\-(beta|alpha)//')" -lt "$(echo "${DOLI_VERSION}" | cut -d. -f3)" ]]; then + echo "Database version is a minor lower version, so we must run the upgrade process" + migrateDatabase + else + echo "Schema update is not required ... Enjoy !" + fi fi fi - fi - lockInstallation - else - # Create the upgrade.unlock file to allow upgrade for develop - echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" - touch /var/www/documents/upgrade.unlock + lockInstallation + else + # Create the upgrade.unlock file to allow upgrade for develop + echo "Create the file to allow upgrade with: touch /var/www/documents/upgrade.unlock" + touch /var/www/documents/upgrade.unlock + fi fi + else + echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" fi - else - echo "File /var/www/documents/install.lock exists and database exists so we cancel database init" - fi - fi - - # Set permission - local CURRENT_UID=$(id -u www-data) - local CURRENT_GID=$(id -g www-data) - usermod -u ${WWW_USER_ID} www-data - groupmod -g ${WWW_GROUP_ID} www-data - - if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then - # Refresh file ownership cause it has changed - echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." - chown -R www-data:www-data /var/www - else - # Reducing load on init : change ownership only for volumes declared in docker - echo "Update ownership for files in /var/www/documents ..." - chown -R www-data:www-data /var/www/documents - fi - - - # Run scripts before starting - runScripts "before-starting.d" - - - echo - echo "*** You can connect to the docker Mariadb with:" - echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" - echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" - echo "or" - echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" - echo "ls /var/lib/mysql" - echo - echo "*** You can connect to the docker Dolibarr with:" - echo "sudo docker exec -it nameofwebcontainer-web-1 bash" - echo "ls /var/www/documents" - echo "ls /var/www/html" - echo - echo "*** You can access persistent directory from the host with:" - echo "ls /home/dolibarr_mariadb_latest" - echo "ls /home/dolibarr_documents_latest" - echo "ls /home/dolibarr_custom_latest" - echo - echo "*** You can connect to the running Dolibarr web application with:" - echo "http://127.0.0.1:port" - echo -} + fi + # Set permission + CURRENT_UID=$(id -u www-data) + local CURRENT_UID + CURRENT_GID=$(id -g www-data) + local CURRENT_GID -# main script + usermod -u "${WWW_USER_ID}" www-data + groupmod -g "${WWW_GROUP_ID}" www-data + + if [[ ${CURRENT_UID} -ne ${WWW_USER_ID} || ${CURRENT_GID} -ne ${WWW_GROUP_ID} ]]; then + # Refresh file ownership cause it has changed + echo "As UID / GID have changed from default, update ownership for files in /var/ww ..." + chown -R www-data:www-data /var/www + else + # Reducing load on init : change ownership only for volumes declared in docker + echo "Update ownership for files in /var/www/documents ..." + chown -R www-data:www-data /var/www/documents + fi + + # Run scripts before starting + runScripts "before-starting.d" + + echo + echo "*** You can connect to the docker Mariadb with:" + echo "sudo docker exec -it nameofwebcontainer-mariadb-1 bash" + echo "mariadb -uroot -p'MYSQL_ROOT_PASSWORD' -h localhost" + echo "or" + echo "mariadb -uxxx -p'yyy' -h mariadb with xxx in /run/secrets/mysql-user and yyy in /run/secrets/mysql-password if these files were used in docker-compose.yml" + echo "ls /var/lib/mysql" + echo + echo "*** You can connect to the docker Dolibarr with:" + echo "sudo docker exec -it nameofwebcontainer-web-1 bash" + echo "ls /var/www/documents" + echo "ls /var/www/html" + echo + echo "*** You can access persistent directory from the host with:" + echo "ls /home/dolibarr_mariadb_latest" + echo "ls /home/dolibarr_documents_latest" + echo "ls /home/dolibarr_custom_latest" + echo + echo "*** You can connect to the running Dolibarr web application with:" + echo "http://127.0.0.1:port" + echo +} + +# main script echo "docker-run.sh started" @@ -484,14 +480,14 @@ run set -e if [[ ${DOLI_CRON} -eq 1 ]]; then - echo "PATH=\$PATH:/usr/local/bin" > /etc/cron.d/dolibarr - echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >> /etc/cron.d/dolibarr - cron -f - exit 0 + echo "PATH=\$PATH:/usr/local/bin" >/etc/cron.d/dolibarr + echo "*/5 * * * * root /bin/su www-data -s /bin/sh -c '/var/www/scripts/cron/cron_run_jobs.php ${DOLI_CRON_KEY} ${DOLI_CRON_USER}' > /proc/1/fd/1 2> /proc/1/fd/2" >>/etc/cron.d/dolibarr + cron -f + exit 0 fi if [ "${1#-}" != "$1" ]; then - set -- apache2-foreground "$@" + set -- apache2-foreground "$@" fi exec "$@" diff --git a/test.sh b/test.sh index 3888094..d6f1812 100755 --- a/test.sh +++ b/test.sh @@ -6,9 +6,11 @@ # sudo test.sh 18.0.5 php8.1 # +# shellcheck disable=SC1001 + set -e -BASE_DIR="$( cd "$(dirname "$0")" && pwd )" +BASE_DIR="$(cd "$(dirname "$0")" && pwd)" DOLI_VER=${1} PHP_VER=${2:-""} @@ -28,45 +30,45 @@ rm -rf "${BASE_DIR}/docker-compose-links/" && mkdir "${BASE_DIR}/docker-compose- # shellcheck disable=SC2044 for directory in $(find "${BASE_DIR}/images" -maxdepth 1 -mindepth 1 -type d -printf '%f\n'); do - dolibarrVersion=$(echo "${directory}" | cut -d\- -f1) - phpVersion=$(echo "${directory}" | cut -d\- -f2) + dolibarrVersion=$(echo "${directory}" | cut -d\- -f1) + phpVersion=$(echo "${directory}" | cut -d\- -f2) - #dolibarrMajor=$(echo "${dolibarrVersion}" | cut -d. -f1) - phpMajor=$(echo "${phpVersion}" | cut -d. -f1) + #dolibarrMajor=$(echo "${dolibarrVersion}" | cut -d. -f1) + phpMajor=$(echo "${phpVersion}" | cut -d. -f1) - ln -nfs "${BASE_DIR}/images/${directory}" "${BASE_DIR}/docker-compose-links/${directory}" - if [ "${phpMajor}" = "php7" ]; then - ln -nfs "${BASE_DIR}/images/${directory}" "${BASE_DIR}/docker-compose-links/${dolibarrVersion}" - fi + ln -nfs "${BASE_DIR}/images/${directory}" "${BASE_DIR}/docker-compose-links/${directory}" + if [ "${phpMajor}" = "php7" ]; then + ln -nfs "${BASE_DIR}/images/${directory}" "${BASE_DIR}/docker-compose-links/${dolibarrVersion}" + fi done -if which docker-compose > /dev/null; then - dockerComposeBin="docker-compose" +if which docker-compose >/dev/null; then + dockerComposeBin="docker-compose" else - dockerComposeBin="docker compose" + dockerComposeBin="docker compose" fi echo "Testing for:" echo " - Dolibarr ${DOLI_VER}" if [ "${PHP_VER}" = "" ]; then - echo " - PHP most recent" - echo "Stopping existing image (if exists) ..." - echo "DOLI_VERSION=${DOLI_VER} PHP_VERSION='' $dockerComposeBin -f '${BASE_DIR}/docker-compose.yml' [down|...]" - DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down 1>/dev/null - echo "Building image using docker-compose.yml in $BASE_DIR..." - DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" build web - echo "Starting image ..." - DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" up --force-recreate web cron - echo "Stopping image ..." - DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down + echo " - PHP most recent" + echo "Stopping existing image (if exists) ..." + echo "DOLI_VERSION=${DOLI_VER} PHP_VERSION='' $dockerComposeBin -f '${BASE_DIR}/docker-compose.yml' [down|...]" + DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down 1>/dev/null + echo "Building image using docker-compose.yml in $BASE_DIR..." + DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" build web + echo "Starting image ..." + DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" up --force-recreate web cron + echo "Stopping image ..." + DOLI_VERSION=${DOLI_VER} PHP_VERSION="" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down else - echo " - PHP ${PHP_VER}" - echo "Stopping existing image (if exists) ..." - DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down 1>/dev/null - echo "Building image using docker-compose.yml in $BASE_DIR..." - DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" build web - echo "Starting image ..." - DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" up --force-recreate web cron - echo "Stopping image ..." - DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down + echo " - PHP ${PHP_VER}" + echo "Stopping existing image (if exists) ..." + DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down 1>/dev/null + echo "Building image using docker-compose.yml in $BASE_DIR..." + DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" build web + echo "Starting image ..." + DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" up --force-recreate web cron + echo "Stopping image ..." + DOLI_VERSION=${DOLI_VER} PHP_VERSION="-php${PHP_VER}" $dockerComposeBin -f "${BASE_DIR}/docker-compose.yml" down fi diff --git a/update.sh b/update.sh index 792124a..d316723 100755 --- a/update.sh +++ b/update.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# Run this script to generate all files (Dockerfile, docker-init.php, docker-run.php) found into images directory, +# Run this script to generate all files (Dockerfile, docker-init.php, docker-run.php) found into images directory, # used for each image. The source files are the files into the root. # @@ -9,21 +9,23 @@ set -e DOCKER_BUILD=${DOCKER_BUILD:-0} DOCKER_PUSH=${DOCKER_PUSH:-0} -BASE_DIR="$( cd "$(dirname "$0")" && pwd )" +BASE_DIR="$(cd "$(dirname "$0")" && pwd)" source "${BASE_DIR}/versions.sh" # If a target version is provided to the build script, only build this one - if [ "$#" -ge "1" ] - then - DOLIBARR_VERSIONS=("$1") - fi +if [ "$#" -ge "1" ]; then + DOLIBARR_VERSIONS=("$1") +fi tags="" # Generate an up-to-date copy of .github/workflows/build.yml using the Dolibarr versions as defined in versions.sh -FORMATTED_DOLIBARR_VERSIONS=$(IFS=","; echo "${DOLIBARR_VERSIONS[*]}") -sed 's/%DOLIBARR_VERSIONS%/'"$FORMATTED_DOLIBARR_VERSIONS"'/g' "${BASE_DIR}/.github/build.yml.template" | sed 's/,/, /g' > "${BASE_DIR}/.github/workflows/build.yml" +FORMATTED_DOLIBARR_VERSIONS=$( + IFS="," + echo "${DOLIBARR_VERSIONS[*]}" +) +sed 's/%DOLIBARR_VERSIONS%/'"$FORMATTED_DOLIBARR_VERSIONS"'/g' "${BASE_DIR}/.github/build.yml.template" | sed 's/,/, /g' >"${BASE_DIR}/.github/workflows/build.yml" # Clean the directory /images if [ -f "${BASE_DIR}/images/README.md" ]; then @@ -32,86 +34,89 @@ fi rm -rf "${BASE_DIR}/images" "${BASE_DIR}/docker-compose-links" for dolibarrVersion in "${DOLIBARR_VERSIONS[@]}"; do - echo "Generate Dockerfile for Dolibarr ${dolibarrVersion}" - - tags="${tags}\n\*" - dolibarrMajor=$(echo ${dolibarrVersion} | cut -d. -f1) - - # Mapping PHP version according to Dolibarr version (See https://wiki.dolibarr.org/index.php/Versions) - # Regarding PHP Supported version : https://www.php.net/supported-versions.php - if [ "${dolibarrVersion}" = "develop" ] || [ "${dolibarrMajor}" -ge "19" ] || [ "${dolibarrMajor}" -ge "20" ] || [ "${dolibarrMajor}" -ge "21" ]; then - php_base_images=( "8.2-apache-bookworm" ) - elif [ "${dolibarrMajor}" -ge "16" ]; then - php_base_images=( "8.1-apache-bookworm" ) - else - php_base_images=( "7.4-apache-bullseye" ) - fi - - for php_base_image in "${php_base_images[@]}"; do - php_version=$(echo "${php_base_image}" | cut -d\- -f1) - - if [ "${dolibarrVersion}" = "develop" ]; then - currentTag="${dolibarrVersion}" - else - currentTag="${dolibarrVersion}-php${php_version}" - tags="${tags} ${currentTag}" - fi - - buildOptionTags="--tag dolibarr/dolibarr:${currentTag}" - if [ "${dolibarrVersion}" != "develop" ]; then - buildOptionTags="${buildOptionTags} --tag dolibarr/dolibarr:${dolibarrVersion} --tag dolibarr/dolibarr:${dolibarrMajor}" - fi - if [ "${dolibarrVersion}" = "${DOLIBARR_LATEST_TAG}" ]; then - buildOptionTags="${buildOptionTags} --tag dolibarr/dolibarr:latest" - fi - - dir="${BASE_DIR}/images/${currentTag}" - - # Set DOLI_VERSION_FOR_INIT_DEMO to x.y version - if [ ${dolibarrVersion} != "develop" ]; then - DOLI_VERSION_FOR_INIT_DEMO=$(echo "${dolibarrVersion}" | sed 's/\(\.[^\.]*\)\.[^\.]*$/\1/') + echo "Generate Dockerfile for Dolibarr ${dolibarrVersion}" + + tags="${tags}\n\*" + dolibarrMajor=$(echo "${dolibarrVersion}" | cut -d. -f1) + + # Mapping PHP version according to Dolibarr version (See https://wiki.dolibarr.org/index.php/Versions) + # Regarding PHP Supported version : https://www.php.net/supported-versions.php + if [ "${dolibarrVersion}" = "develop" ] || [ "${dolibarrMajor}" -ge "19" ] || [ "${dolibarrMajor}" -ge "20" ] || [ "${dolibarrMajor}" -ge "21" ]; then + php_base_images=("8.2-apache-bookworm") + elif [ "${dolibarrMajor}" -ge "16" ]; then + php_base_images=("8.1-apache-bookworm") else - DOLI_VERSION_FOR_INIT_DEMO=$DOLIBARR_VERSION_FOR_INIT_DEMO + php_base_images=("7.4-apache-bullseye") fi - echo "Replace Dockerfile.template with DOLI_VERSION_FOR_INIT_DEMO=$DOLI_VERSION_FOR_INIT_DEMO" - mkdir -p "${dir}" - sed 's/%PHP_BASE_IMAGE%/'"${php_base_image}"'/;' "${BASE_DIR}/Dockerfile.template" | \ - sed 's/%DOLI_VERSION%/'"${dolibarrVersion}"'/;' | \ - sed 's/%DOLI_VERSION_FOR_INIT_DEMO%/'"${DOLI_VERSION_FOR_INIT_DEMO}"'/;' \ - > "${dir}/Dockerfile" - - cp -a "${BASE_DIR}/docker-init.php" "${dir}/docker-init.php" - cp -a "${BASE_DIR}/docker-run.sh" "${dir}/docker-run.sh" - - if [ "${DOCKER_BUILD}" = "1" ]; then - if [ "${DOCKER_PUSH}" = "1" ]; then - docker buildx build \ - --push \ - --compress \ - --platform linux/amd64,linux/arm64 \ - ${buildOptionTags} \ - "${dir}" - else - docker build \ - --compress \ - ${buildOptionTags} \ - "${dir}" - fi - fi - done - - if [ "${dolibarrVersion}" = "develop" ]; then - tags="${tags} develop" - else - tags="${tags} ${dolibarrVersion} ${dolibarrMajor}" - fi - if [ "${dolibarrVersion}" = "${DOLIBARR_LATEST_TAG}" ]; then - tags="${tags} latest" - fi + for php_base_image in "${php_base_images[@]}"; do + # shellcheck disable=SC1001 + php_version=$(echo "${php_base_image}" | cut -d\- -f1) + + if [ "${dolibarrVersion}" = "develop" ]; then + currentTag="${dolibarrVersion}" + else + currentTag="${dolibarrVersion}-php${php_version}" + tags="${tags} ${currentTag}" + fi + + buildOptionTags="--tag dolibarr/dolibarr:${currentTag}" + if [ "${dolibarrVersion}" != "develop" ]; then + buildOptionTags="${buildOptionTags} --tag dolibarr/dolibarr:${dolibarrVersion} --tag dolibarr/dolibarr:${dolibarrMajor}" + fi + if [ "${dolibarrVersion}" = "${DOLIBARR_LATEST_TAG}" ]; then + buildOptionTags="${buildOptionTags} --tag dolibarr/dolibarr:latest" + fi + + dir="${BASE_DIR}/images/${currentTag}" + + # Set DOLI_VERSION_FOR_INIT_DEMO to x.y version + if [ "${dolibarrVersion}" != "develop" ]; then + # shellcheck disable=SC2001 + DOLI_VERSION_FOR_INIT_DEMO=$(echo "${dolibarrVersion}" | sed 's/\(\.[^\.]*\)\.[^\.]*$/\1/') + else + DOLI_VERSION_FOR_INIT_DEMO=$DOLIBARR_VERSION_FOR_INIT_DEMO + fi + + echo "Replace Dockerfile.template with DOLI_VERSION_FOR_INIT_DEMO=$DOLI_VERSION_FOR_INIT_DEMO" + mkdir -p "${dir}" + sed 's/%PHP_BASE_IMAGE%/'"${php_base_image}"'/;' "${BASE_DIR}/Dockerfile.template" | + sed 's/%DOLI_VERSION%/'"${dolibarrVersion}"'/;' | + sed 's/%DOLI_VERSION_FOR_INIT_DEMO%/'"${DOLI_VERSION_FOR_INIT_DEMO}"'/;' \ + >"${dir}/Dockerfile" + + cp -a "${BASE_DIR}/docker-init.php" "${dir}/docker-init.php" + cp -a "${BASE_DIR}/docker-run.sh" "${dir}/docker-run.sh" + + if [ "${DOCKER_BUILD}" = "1" ]; then + if [ "${DOCKER_PUSH}" = "1" ]; then + # shellcheck disable=SC2086 + docker buildx build \ + --push \ + --compress \ + --platform linux/amd64,linux/arm64 \ + ${buildOptionTags} \ + "${dir}" + else + # shellcheck disable=SC2086 + docker build \ + --compress \ + ${buildOptionTags} \ + "${dir}" + fi + fi + done + + if [ "${dolibarrVersion}" = "develop" ]; then + tags="${tags} develop" + else + tags="${tags} ${dolibarrVersion} ${dolibarrMajor}" + fi + if [ "${dolibarrVersion}" = "${DOLIBARR_LATEST_TAG}" ]; then + tags="${tags} latest" + fi done - if [ -f "/tmp/tmp-README.md" ]; then mv "/tmp/tmp-README.md" "${BASE_DIR}/images/README.md" fi diff --git a/versions.sh b/versions.sh index 53bfdc0..7cfab1a 100644 --- a/versions.sh +++ b/versions.sh @@ -1,5 +1,7 @@ #!/bin/bash +# shellcheck disable=SC2034 + set -e # The list of version to build docker packages for