Menu Close

How to Install Postmill on Ubuntu 18.04 LTS with Apache or Nginx

postmill banner


Postmill is a free and open-source web-based social link aggregator with voting and nested comments, similar to the popular Reddit platform. This article will explain the full installation process on a Vultr Ubuntu 18.04 LTS system, including the setup of Nginx and Apache as replacements for the Symfony web server.


  • A Ubuntu 18.04 instance (2GB+ of physical memory recommended)
  • Access to a user with sudo privileges, we’ll assume this user is user1 in the rest of this guide.

Swap file

If your system has less than 2 gigabytes of memory, you may run into memory allocation errors during the installation process. We’ll create a 4GB swap file to avoid such issues, but keep in mind that swap space performs very poorly in comparison to physical memory.

 sudo dd if=/dev/zero of=/swap bs=1k count=4M
sudo chmod 0600 /swap
sudo mkswap /swap
sudo swapon /swap
echo "/swap swap swap defaults 0 0" | sudo tee -a /etc/fstab


Preparing the system

First, we’ll update the system and install a few needed packages.

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https

Then we’ll install package repositories for Node.js and yarn, in order to get the needed package versions.

curl -sS | sudo apt-key add -
echo "deb stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
curl -sL | sudo bash -

And install the needed packages (which consists of php libraries, the PostgreSQL database server and client, Node.js and other tools.)

sudo apt update
sudo apt install -y nodejs yarn php php-curl php-gd php-common php-intl php-mbstring php-xml php-json php-pgsql postgresql postgresql-client php-zip unzip php-symfony-polyfill-intl-icu

Downloading Postmill and building its components

Clone the postmill gitlab repository to /var/www/, and give yourself ownership of the resulting directory:

sudo mkdir /var/www
cd /var/www
sudo git clone
sudo chown -R user1:user1 Postmill/
cd Postmill

Keep in mind that the rest of this guide assumes your working directory is /var/www/Postmill/.
Then, install composer (a tool for managing PHP dependencies) in the current directory:

php -r "copy('', 'composer-setup.php');"
php composer-setup.php

And build the frontend assets with the following commands:

yarn install
yarn run build-prod

Using composer, we will now download and setup the PHP dependencies of Postmill.

php composer.phar install

Database Setup

Postmill requires access to a postgresql database. Create a new PostgreSQL user:

sudo -u postgres createuser --pwprompt postmill

You will be asked to enter a password for the new user, make sure you choose a secure and unique password. We’ll now create a database named ‘postmill’, owned by the user ‘postmill’.

sudo -u postgres createdb -O postmill postmill

Postmill Configuration

Copy the default configuration file .env to .env.local(cp .env .env.local). Changes will be made in the latter to override default values. Open .env.local in a text editor of your choice, and find the following line:


Replace db_user and db_name with postmill; db_password with the password chosen during user creation in the previous step; and 9.6 with your currently installed version. You can run the following PostgreSQL query to determine which version is installed on your system:

sudo -u postgres psql postgres -c 'SELECT version()' | grep PostgreSQL | cut -d' ' -f3

The database URL should now look like the following:


You’ll also need to provide a secret string (on line 23 of the same file) such as:


Do Not use the value provided in this article. You can use the following command to generate a random 40-character string instead:

 cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -1

We can now close that file, and we’ll make sure that the environment meets the necessary requirements:


You should fix any issues that arise from this check before proceeding with the installation.

Now run bin/console doctrine:migrations:migrate to load the database schema, followed by bin/console app:user:add admin1 --admin to create a default administrator account named ‘admin1’. You can choose any other username for this account, you can also create more than one administrator.

At this point, the postmill installation is complete. Further instructions are provided separately for develeopment and production instances.

Development Instances (Symfony web server)

For developing and testing Postmill, the symfony local web server is sufficient. It can be started by running bin/console server:run. By default, symfony will listen on localhost, port 8000/tcp. To access it, SSH port forwarding is recommended. You can read more about SSH port forwarding here.

Production Deployment

When running Postmill in a production environment, you’ll need to use either Apache or Nginx, trying to install both web servers on the same system will not work. Software-specific instructions are provided in subsequent sections.

Open the file we previously created (.env.local) in a text editor and change APP_ENV=dev to APP_ENV=prod. Or use sed to make that change: sed -i "s/APP_ENV=dev/APP_ENV=prod/" .env.local

Apache with mod_php

First, install Apache and make sure it is enabled and running:

sudo apt update
sudo apt install -y apache2
sudo systemctl enable --now apache2.service

Then install the symfony pack for Apache support:

php composer.phar require symfony/apache-pack

Create a new Apache configuration file under /etc/apache2/sites-available/ with a text editor of your choice. For example:

 sudo vim /etc/apache2/sites-available/postmill80.conf

And populate it with the following basic configuration (replace with your domain name or IP address):

<VirtualHost *:80>

DocumentRoot /var/www/Postmill/public

<Directory /var/www/Postmill/public>
AllowOverride All
Order Allow,Deny
Allow from All

<Directory /var/www/Postmill>
Options FollowSymlinks

ErrorLog /var/log/apache2/postmill_error.log
CustomLog /var/log/apache2/postmill_access.log combined


Then enable this configuration: sudo a2ensite postmill80.conf
Some apache modules need to be enabled/disabled:

sudo a2dismod mpm_event
sudo a2enmod rewrite
sudo a2enmod php7.2

Finally, restart the apache service to apply the changes: sudo systemctl restart apache2.service

You should now be able to access your postmill installation by browsing to the domain name or IP address of your Vultr server.

Nginx with PHP-FPM

Start by installing the PHP FastCGI process manager and Nginx, and make sure both services are enabled and running:

sudo apt update
sudo apt install -y nginx php-fpm
sudo systemctl enable --now nginx.service php7.2-fpm.service

Create a new configuration file in /etc/nginx/sites-available/ with a text editor of your choice. For example:

 sudo vim /etc/nginx/sites-available/postmill80.conf

And enter the following minimal configuration (replace with your domain name or IP address):

server {
root /var/www/Postmill/public;

location / {
try_files $uri /index.php$is_args$args;

location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

location ~ \.php$ {
return 404;

error_log /var/log/nginx/postmill_error.log;
access_log /var/log/nginx/postmill_access.log;

We now need to enable it by creating a link in the ‘sites-enabled’ directory, and reload the Nginx service to apply the new configuration:

sudo ln -s /etc/nginx/sites-available/postmill80.conf /etc/nginx/sites-enabled/
sudo systemctl reload nginx.service

You should now be able to access your postmill installation by browsing to the domain name or IP address of your Vultr server.

Common problems

PostgreSQL errors such as [An exception occurred in driver: SQLSTATE[08006] [7] FATAL: password authentication failed for user "postmill"] are often caused by an incorrect database URL in the postmill configuration file (.env.local). Make sure you created a database and its respective user as shown in the postmill configuration section of this guide.

Leave a Reply

Your email address will not be published. Required fields are marked *