1
0

Merge branch 'mysql'

This commit is contained in:
Christian Lück 2014-11-09 18:21:46 +01:00
commit f6e953765f
3 changed files with 120 additions and 35 deletions

View File

@ -3,8 +3,7 @@ MAINTAINER Christian Lück <christian@lueck.tv>
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
nginx git supervisor php5-fpm php5-cli php5-curl php5-gd php5-json \
php5-pgsql
# php5-mysql
php5-pgsql php5-mysql && apt-get clean
# add ttrss as the only nginx site
ADD ttrss.nginx.conf /etc/nginx/sites-available/ttrss

View File

@ -54,7 +54,9 @@ Having trouble getting the above to run?
This is the detailed installation walkthrough.
If you've already followed the [quickstart](#quickstart) guide and everything works, you can skip this part.
### Running
### Select database
This container requires a PostgreSQL or MySQL database instance.
Following docker's best practices, this container does not contain its own database,
but instead expects you to supply a running instance.
@ -63,28 +65,61 @@ database instance and configuration you're relying on.
Also, this makes this container quite disposable, as it doesn't store any sensitive
information at all.
#### Starting a database instance
#### PostgreSQL container
This container requires a PostgreSQL database instance. You're free to pick (or build)
any, as long as is exposes its database port (5432) to the outside.
The recommended way to run this container is by linking it to a PostgreSQL database instance.
You're free to pick (or build) any PostgreSQL container, as long as it exposes
its database port (5432) to the outside.
Example:
Example with nornagon/postgres:
```bash
$ sudo docker run -d --name=ttrssdb nornagon/postgres
$ docker run -d --name=tinydatabase nornagon/postgres:latest
```
#### Testing ttrss in foreground
> The image nornagon/postgres exposes a database superuser that this image uses
to automatically create its user and database,
so you don't have to setup your database credentials here.
For testing purposes it's recommended to initially start this container in foreground.
This is particular useful for your initial database setup, as errors get reported to
the console and further execution will halt.
Use the following database options when running the container:
```
--link tinydatabase:db
```
#### MySQL container
If you'd like to use ttrss with a mysql database backend, simply link it to a
mysql container instead.
You're free to pick (or build) any MySQL container, as long as it exposes
its database port (3306) to the outside.
Example with sameersbn/mysql:
```bash
$ sudo docker run -it --link ttrssdb:db -p 80:80 clue/ttrss
$ docker run -d --name=tinydatabase -e DB_USER=ttrss -e DB_PASS=ttrss -e DB_NAME=ttrss sameersbn/mysql:latest
```
##### Database configuration
> The image sameersbn/mysql does not expose a database superuser,
so you have to explicitly pass the database credentials here.
Use the following database options when running the container:
```
--link tinydatabase:db
```
#### External database server
If you already have a PostgreSQL or MySQL server around off docker you also can go with that.
Instead of linking docker containers you need to provide database hostname and port like so:
```
-e DB_HOST=172.17.42.1
-e DB_PORT=3306
```
### Database configuration
Whenever your run ttrss, it will check your database setup. It assumes the following
default configuration, which can be changed by passing the following additional arguments:
@ -95,7 +130,15 @@ default configuration, which can be changed by passing the following additional
-e DB_PASS=ttrss
```
##### Database superuser
If your database is exposed on a non-standard port you also need to provide DB_TYPE set
to either "pgsql" or "mysql".
```
-e DB_TYPE=pgsql
-e DB_TYPE=mysql
```
### Database superuser
When you run ttrss, it will check your database setup. If it can not connect using the above
configuration, it will automatically try to create a new database and user.
@ -109,7 +152,17 @@ following additional arguments:
-e DB_ENV_PASS=docker
```
#### Running ttrss daemonized
### Testing ttrss in foreground
For testing purposes it's recommended to initially start this container in foreground.
This is particular useful for your initial database setup, as errors get reported to
the console and further execution will halt.
```bash
$ docker run -it --link tinydatabase:db -p 80:80 clue/ttrss
```
### Running ttrss daemonized
Once you've confirmed everything works in the foreground, you can start your container
in the background by replacing the `-it` argument with `-d` (daemonize).
@ -117,5 +170,5 @@ Remaining arguments can be passed just like before, the following is the recomme
minimum:
```bash
$ sudo docker run -d --link tinystore:db -p 80:80 clue/ttrss
$ docker run -d --link tinydatabase:db -p 80:80 clue/ttrss
```

View File

@ -1,27 +1,53 @@
#!/usr/bin/env php
<?php
$ename = 'DB';
$eport = 5432;
$confpath = '/var/www/config.php';
// check DB_NAME, which will be set automatically for a linked "db" container
if (!env($ename . '_PORT', '')) {
error('The env ' . $ename .'_PORT does not exist. Make sure to run with "--link mypostgresinstance:' . $ename . '"');
$config = array();
if (getenv('DB_TYPE') !== false) {
$config['DB_TYPE'] = getenv('DB_TYPE');
} elseif (getenv('DB_PORT_5432_TCP_ADDR') !== false) {
// postgres container linked
$config['DB_TYPE'] = 'pgsql';
$eport = 5432;
} elseif (getenv('DB_PORT_3306_TCP_ADDR') !== false) {
// mysql container linked
$config['DB_TYPE'] = 'mysql';
$eport = 3306;
}
$config = array();
$config['DB_TYPE'] = 'pgsql';
$config['DB_HOST'] = env($ename . '_PORT_' . $eport . '_TCP_ADDR');
$config['DB_PORT'] = env($ename . '_PORT_' . $eport . '_TCP_PORT');
if (!empty($eport)) {
$config['DB_HOST'] = env('DB_PORT_' . $eport . '_TCP_ADDR');
$config['DB_PORT'] = env('DB_PORT_' . $eport . '_TCP_PORT');
} elseif (getenv('DB_PORT') === false) {
error('The env DB_PORT does not exist. Make sure to run with "--link mypostgresinstance:DB"');
} elseif (is_numeric(getenv('DB_PORT')) && getenv('DB_HOST') !== false) {
// numeric DB_PORT provided; assume port number passed directly
$config['DB_HOST'] = env('DB_HOST');
$config['DB_PORT'] = env('DB_PORT');
if (empty($config['DB_TYPE'])) {
switch ($config['DB_PORT']) {
case 3306:
$config['DB_TYPE'] = 'mysql';
break;
case 5432:
$config['DB_TYPE'] = 'pgsql';
break;
default:
error('Database on non-standard port ' . $config['DB_PORT'] . ' and env DB_TYPE not present');
}
}
}
// database credentials for this instance
// database name (DB_NAME) can be supplied or detaults to "ttrss"
// database user (DB_USER) can be supplied or defaults to database name
// database pass (DB_PASS) can be supplied or defaults to database user
$config['DB_NAME'] = env($ename . '_NAME', 'ttrss');
$config['DB_USER'] = env($ename . '_USER', $config['DB_NAME']);
$config['DB_PASS'] = env($ename . '_PASS', $config['DB_USER']);
$config['DB_NAME'] = env('DB_NAME', 'ttrss');
$config['DB_USER'] = env('DB_USER', $config['DB_NAME']);
$config['DB_PASS'] = env('DB_PASS', $config['DB_USER']);
if (!dbcheck($config)) {
echo 'Database login failed, trying to create...' . PHP_EOL;
@ -32,12 +58,19 @@ if (!dbcheck($config)) {
$super = $config;
$super['DB_NAME'] = null;
$super['DB_USER'] = env($ename . '_ENV_USER', 'docker');
$super['DB_PASS'] = env($ename . '_ENV_PASS', $super['DB_USER']);
$super['DB_USER'] = env('DB_ENV_USER', 'docker');
$super['DB_PASS'] = env('DB_ENV_PASS', $super['DB_USER']);
$pdo = dbconnect($super);
$pdo->exec('CREATE ROLE ' . ($config['DB_USER']) . ' WITH LOGIN PASSWORD ' . $pdo->quote($config['DB_PASS']));
$pdo->exec('CREATE DATABASE ' . ($config['DB_NAME']) . ' WITH OWNER ' . ($config['DB_USER']));
if ($super['DB_TYPE'] === 'mysql') {
$pdo->exec('CREATE DATABASE ' . ($config['DB_NAME']));
$pdo->exec('GRANT ALL PRIVILEGES ON ' . ($config['DB_NAME']) . '.* TO ' . $pdo->quote($config['DB_USER']) . '@"%" IDENTIFIED BY ' . $pdo->quote($config['DB_PASS']));
} else {
$pdo->exec('CREATE ROLE ' . ($config['DB_USER']) . ' WITH LOGIN PASSWORD ' . $pdo->quote($config['DB_PASS']));
$pdo->exec('CREATE DATABASE ' . ($config['DB_NAME']) . ' WITH OWNER ' . ($config['DB_USER']));
}
unset($pdo);
if (dbcheck($config)) {
@ -89,14 +122,14 @@ function error($text)
function dbconnect($config)
{
$map = array('host' => 'HOST', 'port' => 'PORT', 'dbname' => 'NAME', 'user' => 'USER', 'password' => 'PASS');
$map = array('host' => 'HOST', 'port' => 'PORT', 'dbname' => 'NAME');
$dsn = $config['DB_TYPE'] . ':';
foreach ($map as $d => $h) {
if (isset($config['DB_' . $h])) {
$dsn .= $d . '=' . $config['DB_' . $h] . ';';
}
}
$pdo = new \PDO($dsn);
$pdo = new \PDO($dsn, $config['DB_USER'], $config['DB_PASS']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}