diff options
| author | 2021-01-11 22:36:50 +0100 | |
|---|---|---|
| committer | 2021-01-11 22:36:50 +0100 | |
| commit | 8dfe2097992307b572b42647b53a76dd5d93aaa9 (patch) | |
| tree | 5c5cecd7437ee584cc540a98f5597196f74fa4de /lib | |
| parent | fd8258775643eb0d898679f210c00de07c79eadc (diff) | |
Possiblity to autoinstall in Docker Compose (#3353)
* Possiblity to autoinstall in Docker Compose
#fix https://github.com/FreshRSS/FreshRSS/issues/3349
It is simply calling our existing CLI: do-install.php and
create-user.php
https://github.com/FreshRSS/FreshRSS/tree/master/cli
FreshRSS will typically be ready a few seconds before the database, so
introduce a tolerance when the database is not available / up (yet) by
trying a few times to connect. Also useful to avoid service interruption
when DB service is restarted.
Example:
```yml
freshrss-app:
image: freshrss/freshrss
container_name:
freshrss-app
hostname: freshrss-app
restart: unless-stopped
ports:
- "8080:80"
depends_on:
- freshrss-db
volumes:
- data:/var/www/FreshRSS/data
-
extensions:/var/www/FreshRSS/extensions
environment:
CRON_MIN:
'*/20'
FRESHRSS_ENV: development
FRESHRSS_INSTALL: |-
--api_enabled
--base_url https://rss.example.net
--db-base freshrss
--db-host freshrss-db
--db-password
freshrss
--db-type pgsql
--db-user freshrss
--default_user admin
--language en
FRESHRSS_USER: |-
--api_password freshrss
--email user@example.net
--language en
--password freshrss
--user admin
TZ:
Europe/Paris
```
* Minor type f in find
* shellcheck
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Minz/ModelPdo.php | 110 |
1 files changed, 63 insertions, 47 deletions
diff --git a/lib/Minz/ModelPdo.php b/lib/Minz/ModelPdo.php index 7c6c82129..4a1abc8e7 100644 --- a/lib/Minz/ModelPdo.php +++ b/lib/Minz/ModelPdo.php @@ -21,6 +21,51 @@ class Minz_ModelPdo { protected $pdo; protected $current_user; + private function dbConnect() { + $db = Minz_Configuration::get('system')->db; + $driver_options = isset($db['pdo_options']) && is_array($db['pdo_options']) ? $db['pdo_options'] : []; + $dbServer = parse_url('db://' . $db['host']); + $dsn = ''; + $dsnParams = empty($db['connection_uri_params']) ? '' : (';' . $db['connection_uri_params']); + + switch ($db['type']) { + case 'mysql': + $dsn = 'mysql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']) . ';charset=utf8mb4'; + if (!empty($db['base'])) { + $dsn .= ';dbname=' . $db['base']; + } + if (!empty($dbServer['port'])) { + $dsn .= ';port=' . $dbServer['port']; + } + $driver_options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES utf8mb4'; + $this->pdo = new Minz_PdoMysql($dsn . $dsnParams, $db['user'], $db['password'], $driver_options); + $this->pdo->setPrefix($db['prefix'] . $this->current_user . '_'); + break; + case 'sqlite': + $dsn = 'sqlite:' . join_path(DATA_PATH, 'users', $this->current_user, 'db.sqlite'); + $this->pdo = new Minz_PdoSqlite($dsn . $dsnParams, $db['user'], $db['password'], $driver_options); + $this->pdo->setPrefix(''); + break; + case 'pgsql': + $dsn = 'pgsql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']); + if (!empty($db['base'])) { + $dsn .= ';dbname=' . $db['base']; + } + if (!empty($dbServer['port'])) { + $dsn .= ';port=' . $dbServer['port']; + } + $this->pdo = new Minz_PdoPgsql($dsn . $dsnParams, $db['user'], $db['password'], $driver_options); + $this->pdo->setPrefix($db['prefix'] . $this->current_user . '_'); + break; + default: + throw new Minz_PDOConnectionException( + 'Invalid database type!', + $db['user'], Minz_Exception::ERROR + ); + } + self::$sharedPdo = $this->pdo; + } + /** * Créé la connexion à la base de données à l'aide des variables * HOST, BASE, USER et PASS définies dans le fichier de configuration @@ -45,57 +90,28 @@ class Minz_ModelPdo { $this->current_user = $currentUser; self::$sharedCurrentUser = $currentUser; - $conf = Minz_Configuration::get('system'); - $db = $conf->db; - - $driver_options = isset($db['pdo_options']) && is_array($db['pdo_options']) ? $db['pdo_options'] : []; - $dbServer = parse_url('db://' . $db['host']); - $dsn = ''; - $dsnParams = empty($db['connection_uri_params']) ? '' : (';' . $db['connection_uri_params']); - - try { - switch ($db['type']) { - case 'mysql': - $dsn = 'mysql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']) . ';charset=utf8mb4'; - if (!empty($db['base'])) { - $dsn .= ';dbname=' . $db['base']; - } - if (!empty($dbServer['port'])) { - $dsn .= ';port=' . $dbServer['port']; - } - $driver_options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES utf8mb4'; - $this->pdo = new Minz_PdoMysql($dsn . $dsnParams, $db['user'], $db['password'], $driver_options); - $this->pdo->setPrefix($db['prefix'] . $currentUser . '_'); - break; - case 'sqlite': - $dsn = 'sqlite:' . join_path(DATA_PATH, 'users', $currentUser, 'db.sqlite'); - $this->pdo = new Minz_PdoSqlite($dsn . $dsnParams, $db['user'], $db['password'], $driver_options); - $this->pdo->setPrefix(''); + $ex = null; + //Attempt a few times to connect to database + for ($attempt = 1; $attempt <= 5; $attempt++) { + try { + $this->dbConnect(); + return; + } catch (PDOException $e) { + $ex = $e; + if (empty($e->errorInfo[0]) || $e->errorInfo[0] !== '08006') { + //We are only only interested in: SQLSTATE connection exception / connection failure break; - case 'pgsql': - $dsn = 'pgsql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']); - if (!empty($db['base'])) { - $dsn .= ';dbname=' . $db['base']; - } - if (!empty($dbServer['port'])) { - $dsn .= ';port=' . $dbServer['port']; - } - $this->pdo = new Minz_PdoPgsql($dsn . $dsnParams, $db['user'], $db['password'], $driver_options); - $this->pdo->setPrefix($db['prefix'] . $currentUser . '_'); - break; - default: - throw new Minz_PDOConnectionException( - 'Invalid database type!', - $db['user'], Minz_Exception::ERROR - ); + } } - self::$sharedPdo = $this->pdo; - } catch (Exception $e) { - throw new Minz_PDOConnectionException( - $e->getMessage(), + sleep(2); + } + + $db = Minz_Configuration::get('system')->db; + + throw new Minz_PDOConnectionException( + $ex->getMessage(), $db['user'], Minz_Exception::ERROR ); - } } public function beginTransaction() { |
