aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2021-01-11 22:36:50 +0100
committerGravatar GitHub <noreply@github.com> 2021-01-11 22:36:50 +0100
commit8dfe2097992307b572b42647b53a76dd5d93aaa9 (patch)
tree5c5cecd7437ee584cc540a98f5597196f74fa4de /lib
parentfd8258775643eb0d898679f210c00de07c79eadc (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.php110
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() {