So, this is a bit about Partkeepr. It's a nice little inventory management system, and if like me you have hobbies that involve lots of little parts, then such a system is invaluable for keeping track of them all.

I have it installed and running on an Ubuntu 18.04 box, and this article describes some of the extra bits not described in the official installation guide.

To start with, the server I'm installing on is a fresh LAMP VM, with Webmin added.

Unzip the Partkeepr ZIP to /var/www. This will have a folder called partkeepr-1.2.0 (or some other version). I recommend renaming this to just /partkeepr

You then need to install some dependencies:

sudo apt-get install php-curl php-cli php-pear php-imagick php-apcu php-gd php-intl php-ldap

Set up a new virtual server in apache as required. My directives for the virtual server are as follows:

DocumentRoot /var/www/partkeepr/web
AcceptPathInfo on
<Directory "/var/www/partkeepr/web">
Require all granted
AllowOverride All
SSLEngine on
SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2
SSLCertificateFile /****/****/*****.***
SSLCertificateKeyFile /****/****/*****.***
SSLCACertificateFile /****/****/*****.***

Reset all file ownership (recursively) in /var/www/partkeepr to www-data:www-data

Recursively Set /data permissions to 777

Recursively set /app/cache to 777

Recursively set /app/logs to 777

Recursively set /web to 777

Edit PHP.ini to include timezone, and increase maximum execution time to, say, 300 seconds

Now, we need to enable the URL rewriting module (rewrite) in Apache.

Bounce Apache

Create MySQL database, and import data if needed.

Add MySQL user for partkeepr.

Bounce MySQL

Now, there's a fix that needs to be done to a configuration file somewhere. It's because PHP7.2, the one included with Ubuntu 18.04, has deprecated a feature used by Symfony somewhere (taken from

Go to file -> /vendor/symfony/monolog-bundle/DependencyInjection/Configuration.php. Around line 594 comment out or remove line below:

// ->ifTrue(function ($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type'] || 'filter' === $v['type']) && 1 !== count($v['handler']); })

add the following line:
->ifTrue(function ($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type'] || 'filter' === $v['type']) && (empty($v['handler']) || !is_string($v['handler'])); })

Save and start the Partkeepr installer. All should be well.

Extra Notes

1. Courtesy of Son Do (This email address is being protected from spambots. You need JavaScript enabled to view it.) - Errors on Warming Cache, and "Unable to load". It appears that these errors are a result of being behind a proxy server.