Installation¶
To install Imbo on the server you can choose between two different methods, Composer (recommended) or git clone.
Using composer¶
The recommended way of installing Imbo is by creating a composer.json
file for your installation, and then install Imbo and optional 3rd party plug-ins via Composer. You will need the following directory structure for this method to work:
/path/to/install/composer.json
/path/to/install/config/
where the composer.json
file can contain:
{
"name": "yourname/imbo",
"require": {
"imbo/imbo": "dev-master"
}
}
and the config/
directory contains one or more configuration files that will be merged with the default configuration. Imbo will load all .php
files in this directory, and the ones returning an array will be used as configuration.
If you want to install 3rd party plug-ins and/or for instance the Doctrine DBAL library simply add these to the require
object in your composer.json
:
{
"name": "yourname/imbo",
"require": {
"imbo/imbo": "dev-master",
"rexxars/imbo-hipsta": "dev-master",
"doctrine/dbal": "2.*"
}
}
If some of the 3rd party plug-ins provide configuration files, you can link to these in the config/
directory to have Imbo automatically load them:
cd /path/to/install/config
ln -s ../vendor/rexxars/imbo-hipsta/config/config.php 01-imbo-hipsta.php
To be able to control the order that Imbo will use when loading the configuration files you should prefix them with a number, like 01
in the example above. Lower numbers will be loaded first, meaning that configuration files with higher numbers will override settings set in configuration files with a lower number.
When you have created the composer.json
file you can install Imbo with Composer:
curl -s https://getcomposer.org/installer | php
php composer.phar install -o --no-dev
After composer has finished installing Imbo and optional dependencies the Imbo installation will reside in /path/to/install/vendor/imbo/imbo
. The correct web server document root in this case would be /path/to/install/vendor/imbo/imbo/public
.
If you later want to update Imbo you can bump the version number you have specified in composer.json
and run:
php composer.phar update -o --no-dev
Regarding the Imbo version you are about to install you can use dev-master
for the latest released version, or you can use a specific version if you want to (recommended). Head over to Packagist to see the available versions. If you’re more of a YOLO type of person you can use dev-develop
for the latest development version. If you choose to use the dev-develop
branch, expect things to break from time to time.
Imbo strives to keep full BC in minor and patch releases, but breaking changes can occur. The most secure way to install one or more Imbo servers is to specify a specific version (for instance 1.2.0
) in your composer.json
file. Read the ChangeLog and the Upgrading Imbo chapter before doing an upgrade.
Using git clone¶
You can also install Imbo directly via git, and then use Composer to install the dependencies:
mkdir /path/to/install; cd /path/to/install
git clone https://github.com/imbo/imbo.git
cd imbo
curl -s https://getcomposer.org/installer | php
php composer.phar install -o --no-dev
In this case the correct web server document root would be /path/to/install/imbo/public
. Remember to checkout the correct branch after cloning the repository to get the version you want, for instance git checkout master
. If you use this method of installation you will have to modify Imbo’s composer.json
to install 3rd party libraries. You will also have to place your own config.php
configuration file in the same directory as the default Imbo configuration file, which in the above example would be the /path/to/install/imbo/config
directory.
If you want to contribute to Imbo, this is the obvious installation method. Read more about this in the Contributing to Imbo chapter.
Web server configuration¶
After installing Imbo by using one of the methods mentioned above you will have to configure the web server you want to use. Imbo ships with sample configuration files for Apache and Nginx that can be used with a few minor adjustments. Both configuration files assume the httpd runs on port 80. If you use Varnish or some other HTTP accelerator simply change the port number to the port that your httpd listens to.
Apache¶
You will need to enable mod_rewrite if you want to use Imbo with Apache. Below is an example on how to configure Apache for Imbo:
<VirtualHost *:80>
# Servername of the virtual host
ServerName imbo
# Define aliases to use multiple hosts
# ServerAlias imbo1 imbo2 imbo3
# Document root where the index.php file is located
DocumentRoot /path/to/install/vendor/imbo/imbo/public
# Logging
# CustomLog /var/log/apache2/imbo.access_log combined
# ErrorLog /var/log/apache2/imbo.error_log
# Rewrite rules that rewrite all requests to the index.php script
<Directory /path/to/install/vendor/imbo/imbo/public>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php
</Directory>
</VirtualHost>
You will need to update ServerName
to match the host name you will use for Imbo. If you want to use several host names you can update the ServerAlias
line as well. You must also update DocumentRoot
and Directory
to point to the public
directory in the Imbo installation. If you want to enable logging update the CustomLog
and ErrorLog
lines. RewriteCond
and RewriteRule
should be left alone.
Nginx¶
Below is an example on how to configure Nginx for Imbo. This example uses PHP via FastCGI:
server {
# Listen on port 80
listen 80;
# Define the server name
server_name imbo;
# Use the line below instead of the server_name above if you want to use multiple host names
# server_name imbo imbo1 imbo2 imbo3;
# Path to the public directory where index.php is located
root /path/to/install/vendor/imbo/imbo/public;
index index.php;
# Logs
# error_log /var/log/nginx/imbo.error_log;
# access_log /var/log/nginx/imbo.access_log main;
location / {
try_files $uri $uri/ /index.php?$args;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /path/to/install/vendor/imbo/imbo/public/index.php;
include fastcgi_params;
}
}
}
You will need to update server_name
to match the host name you will use for Imbo. If you want to use several host names simply put several host names on that line. root
must point to the public
directory in the Imbo installation. If you want to enable logging update the error_log
and access_log
lines. You must also update the fastcgi_param SCRIPT_FILENAME
line to point to the public/index.php
file in the Imbo installation.
Lighttpd¶
Below is an example on how to configure Lighttpd for Imbo. Running PHP through FastCGI is recommended (not covered here).
# Use the line below instead of the next one if you want to use multiple host names
# $HTTP["host"] =~ "^(imbo|imbo1|imbo2|imbo3)$" {
$HTTP["host"] == "imbo" {
# Listen on port 80
server.port = 80
# Path to the public directory where index.php is located
server.document-root = "/path/to/install/vendor/imbo/imbo/public"
# Logs
# server.errorlog = "/var/log/lighttpd/imbo.error_log"
# accesslog.filename = "/var/log/lighttpd/imbo.access_log"
# Rewrite all to index.php
url.rewrite-if-not-file = ("^/[^\?]*(\?.*)?$" => "index.php/$1")
}
You will need to set the correct host name(s) used with $HTTP["host"]
and update the server.document-root
to point to the correct path. If you want to enable logging remove the comments on the lines with server.errorlog
and accesslog.filename
and set the correct paths. If you want to specify a custom access log path you will need to enable the mod_accesslog
module.
This example requires the mod_rewrite
module to be loaded.
Varnish¶
Imbo strives to follow the HTTP Protocol, and can because of this easily leverage Varnish.
The only required configuration you need in your VCL is a default backend:
backend default {
.host = "127.0.0.1";
.port = "81";
}
where .host
and .port
is where Varnish can reach your web server.
If you use the same host name (or a sub-domain) for your Imbo installation as other services, that in turn uses Cookies, you might want the VCL to ignore these Cookies for the requests made against your Imbo installation (unless you have implemented event listeners for Imbo that uses Cookies). To achieve this you can put the following snippet into your VCL file:
sub vcl_recv {
if (req.http.host == "imbo.example.com") {
unset req.http.Cookie;
}
}
or, if you have Imbo installed in some path:
sub vcl_recv {
if (req.http.host ~ "^(www.)?example.com$" && req.url ~ "^/imbo/") {
unset req.http.Cookie;
}
}
if your Imbo installation is available on [www.]example.com/imbo
.
Database setup¶
If you choose to use a RDBMS to store data in, you will need to manually create a database, a user and the tables Imbo stores information in. Below you will find schemas for different RDBMSs. You will find information regarding how to authenticate against the RDBMS of you choice in the Configuration topic.
MySQL¶
CREATE TABLE IF NOT EXISTS `imageinfo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`imageIdentifier` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`size` int(10) unsigned NOT NULL,
`extension` varchar(5) COLLATE utf8_danish_ci NOT NULL,
`mime` varchar(20) COLLATE utf8_danish_ci NOT NULL,
`added` int(10) unsigned NOT NULL,
`updated` int(10) unsigned NOT NULL,
`width` int(10) unsigned NOT NULL,
`height` int(10) unsigned NOT NULL,
`checksum` char(32) COLLATE utf8_danish_ci NOT NULL,
`originalChecksum` char(32) COLLATE utf8_danish_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `image` (`user`,`imageIdentifier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `metadata` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`imageId` int(10) unsigned NOT NULL,
`tagName` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`tagValue` varchar(255) COLLATE utf8_danish_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `imageId` (`imageId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `shorturl` (
`shortUrlId` char(7) COLLATE utf8_danish_ci NOT NULL,
`user` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`imageIdentifier` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`extension` char(3) COLLATE utf8_danish_ci DEFAULT NULL,
`query` text COLLATE utf8_danish_ci NOT NULL,
PRIMARY KEY (`shortUrlId`),
KEY `params` (`user`,`imageIdentifier`,`extension`,`query`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
CREATE TABLE IF NOT EXISTS `storage_images` (
`user` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`imageIdentifier` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`data` blob NOT NULL,
`updated` int(10) unsigned NOT NULL,
PRIMARY KEY (`user`,`imageIdentifier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
CREATE TABLE IF NOT EXISTS `storage_image_variations` (
`user` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`imageIdentifier` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`width` int(10) unsigned NOT NULL,
`data` blob NOT NULL,
PRIMARY KEY (`user`,`imageIdentifier`,`width`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
CREATE TABLE IF NOT EXISTS `imagevariations` (
`user` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`imageIdentifier` varchar(255) COLLATE utf8_danish_ci NOT NULL,
`width` int(10) unsigned NOT NULL,
`height` int(10) unsigned NOT NULL,
`added` int(10) unsigned NOT NULL,
PRIMARY KEY (`user`,`imageIdentifier`,`width`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
The storage_images
table is only needed if you plan on storing the actual images in the database as well.
SQLite¶
CREATE TABLE IF NOT EXISTS imageinfo (
id INTEGER PRIMARY KEY NOT NULL,
user TEXT NOT NULL,
imageIdentifier TEXT NOT NULL,
size INTEGER NOT NULL,
extension TEXT NOT NULL,
mime TEXT NOT NULL,
added INTEGER NOT NULL,
updated INTEGER NOT NULL,
width INTEGER NOT NULL,
height INTEGER NOT NULL,
checksum TEXT NOT NULL,
originalChecksum TEXT NOT NULL,
UNIQUE (user,imageIdentifier)
);
CREATE TABLE IF NOT EXISTS metadata (
id INTEGER PRIMARY KEY NOT NULL,
imageId KEY INTEGER NOT NULL,
tagName TEXT NOT NULL,
tagValue TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS shorturl (
shortUrlId TEXT PRIMARY KEY NOT NULL,
user TEXT NOT NULL,
imageIdentifier TEXT NOT NULL,
extension TEXT,
query TEXT NOT NULL
);
CREATE INDEX shorturlparams ON shorturl (
user,
imageIdentifier,
extension,
query
);
CREATE TABLE IF NOT EXISTS storage_images (
user TEXT NOT NULL,
imageIdentifier TEXT NOT NULL,
data BLOB NOT NULL,
updated INTEGER NOT NULL,
PRIMARY KEY (user,imageIdentifier)
);
CREATE TABLE IF NOT EXISTS storage_image_variations (
user TEXT NOT NULL,
imageIdentifier TEXT NOT NULL,
width INTEGER NOT NULL,
data BLOB NOT NULL,
PRIMARY KEY (user,imageIdentifier,width)
);
CREATE TABLE IF NOT EXISTS imagevariations (
user TEXT NOT NULL,
imageIdentifier TEXT NOT NULL,
width INTEGER NOT NULL,
height INTEGER NOT NULL,
added INTEGER NOT NULL,
PRIMARY KEY (user,imageIdentifier,width)
);
The storage_images
table is only needed if you plan on storing the actual images in the database as well.