Skip to content

Instantly share code, notes, and snippets.

@gkwurst
Last active April 29, 2025 01:41
Show Gist options
  • Save gkwurst/87d240cf518cdbea8a78403c51f14885 to your computer and use it in GitHub Desktop.
Save gkwurst/87d240cf518cdbea8a78403c51f14885 to your computer and use it in GitHub Desktop.
Installation script for Mail Piler (open source version) with Manticore on Ubuntu 24.04 Noble (credit cmer)
#!/bin/bash
#
#
# This script installs the latest open source version of Mail Piler (mailpiler.org) from the master
# branch on GitHub by compiling it from source. It also installs all dependencies, including a MySQL database.
#
# You should run this script as root on a vanilla Ubuntu 24.04 installation.
#
#
set -o errexit
set -o pipefail
set -o nounset
set -x
PILER_HOSTNAME="${PILER_HOSTNAME:-piler.yourdomain.com}"
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-yourpassword}"
MYSQL_PILER_PASSWORD="${MYSQL_PILER_PASSWORD:-yourpassword}"
SERVER_ID="${SERVER_ID:-0}"
USE_SMTP_GATEWAY="${USE_SMTP_GATEWAY:-0}"
SPHINX_WORKER_LISTEN_ADDRESS="${SPHINX_WORKER_LISTEN_ADDRESS:-}"
PHP_FPM_SOCKET="/var/run/php/php8.3-fpm.sock"
MYSQL_HOSTNAME="localhost"
MYSQL_DATABASE="piler"
MYSQL_USERNAME="piler"
PILER_TARBALL="https://github.com/jsuto/piler/archive/refs/heads/master.zip"
PILER_USER="piler"
CONFIG_SITE_PHP="/etc/piler/config-site.php"
CONFIG_SITE_DIST_PHP="/etc/piler/config-site.dist.php"
export DEBIAN_FRONTEND=noninteractive
install_prerequisites() {
apt-get update
apt-get -y --no-install-recommends install \
wget rsyslog openssl sysstat php8.3-cli php8.3-cgi php8.3-mysql php8.3-fpm php8.3-zip php8.3-ldap \
php8.3-gd php8.3-curl php8.3-xml ca-certificates zip catdoc unrtf poppler-utils nginx tnef libzip-dev \
libtre5 libwrap0 cron libmariadb-dev python3 python3-mysqldb libmariadb-dev mariadb-client \
mariadb-server build-essential libssl-dev libtre-dev libzip-dev libcurl4-openssl-dev unzip
}
install_manticore() {
wget https://repo.manticoresearch.com/manticore-repo.noarch.deb
dpkg -i manticore-repo.noarch.deb
apt update
apt -y install manticore manticore-extra
}
create_user() {
egrep -i "^x$PILER_USER:" /etc/passwd || adduser --no-create-home --disabled-password --disabled-login --gecos "" $PILER_USER
# egrep -i "^x$PILER_USER:" /etc/passwd || adduser --disabled-password --gecos "" --shell /bin/bash $PILER_USER
}
create_mysql_user_and_database() {
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER IF NOT EXISTS '$MYSQL_USERNAME'@'$MYSQL_HOSTNAME';"
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "SET PASSWORD FOR '$MYSQL_USERNAME'@'$MYSQL_HOSTNAME' = PASSWORD('$MYSQL_PILER_PASSWORD');"
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET 'utf8mb4';"
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "GRANT ALL PRIVILEGES ON $MYSQL_DATABASE.* to '$MYSQL_USERNAME'@'$MYSQL_HOSTNAME' IDENTIFIED BY '$MYSQL_PILER_PASSWORD';"
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "FLUSH PRIVILEGES;"
mysql -u $MYSQL_USERNAME -p"$MYSQL_PILER_PASSWORD" $MYSQL_DATABASE < /etc/piler/db-mysql.sql
}
fix_mysql_settings() {
cat > /etc/mysql/mariadb.conf.d/99-piler.cnf << PILER_CNF
[mysqld]
innodb_buffer_pool_size=512M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=64M
innodb_log_file_size=64M
innodb_read_io_threads=4
innodb_write_io_threads=4
innodb_log_files_in_group=2
innodb_file_per_table
PILER_CNF
}
start_mysql() {
fix_mysql_settings
service mysql restart
}
install_piler() {
mkdir -p tmp && wget "${PILER_TARBALL}" -O tmp/piler-master.zip
unzip tmp/piler-master -d tmp
pushd tmp/piler-master
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-database=mariadb --enable-tcpwrappers --enable-memcached
make clean all install
cp ./contrib/webserver/piler-nginx.conf /etc/piler/piler-nginx.conf.dist
cp ./etc/sphinx.conf.dist /etc/piler/sphinx.conf
cp ./util/db-mysql.sql /etc/piler/db-mysql.sql
popd
crontab -u "$PILER_USER" /usr/share/piler/piler.cron
touch /var/piler/.bash_history
chown "${PILER_USER}:${PILER_USER}" /var/piler/.bash_history
}
create_my_cnf() {
local user=$1
local password=$2
local my_cnf=$3
printf "[client]\\n\\nhost = %s\\nuser = %s\\npassword = %s\\n" "$MYSQL_HOSTNAME" "$user" "$password" > "$my_cnf"
printf "\\n\\n[mysqldump]\\n\\nhost = %s\\nuser = %s\\npassword = %s\\n" "$MYSQL_HOSTNAME" "$user" "$password" >> "$my_cnf"
chown $PILER_USER:$PILER_USER "$my_cnf"
chmod 600 "$my_cnf"
}
fix_config_site_php() {
cp $CONFIG_SITE_DIST_PHP $CONFIG_SITE_PHP
sed -i -e "s%HOSTNAME%${PILER_HOSTNAME}%g" -e "s%MYSQL_PASSWORD%${MYSQL_PILER_PASSWORD}%g" "$CONFIG_SITE_PHP"
{
echo "\$config['SERVER_ID'] = $SERVER_ID;"
echo "\$config['USE_SMTP_GATEWAY'] = $USE_SMTP_GATEWAY;"
echo "\$config['SPHINX_VERSION'] = 331;"
} >> "$CONFIG_SITE_PHP"
if [[ "$SPHINX_WORKER_LISTEN_ADDRESS" ]]; then
echo "\$config['SPHINX_WORKER_LISTEN_ADDRESS'] = '$SPHINX_WORKER_LISTEN_ADDRESS';" >> "$CONFIG_SITE_PHP"
fi
echo "\$config['ARCHIVE_HOST'] = '$PILER_HOSTNAME';" >> "$CONFIG_SITE_PHP"
}
add_systemd_services() {
pushd /etc/systemd/system
ln -sf /usr/libexec/piler/pilersearch.service .
ln -sf /usr/libexec/piler/piler.service .
ln -sf /usr/libexec/piler/piler-smtp.service .
popd
systemctl daemon-reload
systemctl enable pilersearch
systemctl enable piler
systemctl enable piler-smtp
}
create_cipher_key() {
dd if=/dev/urandom bs=56 count=1 of=/etc/piler/piler.key
chmod 640 /etc/piler/piler.key
chown piler:piler /etc/piler/piler.key
}
fix_configs() {
touch /etc/piler/MANTICORE
if [[ ! -f /etc/piler/piler-nginx.conf ]]; then
sed -e "s%PILER_HOST%$PILER_HOSTNAME%g" -e "s%PHP_FPM_SOCKET%$PHP_FPM_SOCKET%g" /etc/piler/piler-nginx.conf.dist > /etc/piler/piler-nginx.conf
ln -s /etc/piler/piler-nginx.conf /etc/nginx/sites-enabled/piler.conf
nginx -t
nginx -s reload
fi
if [[ ! -f /etc/piler/piler.conf ]]; then
sed -e "s/verystrongpassword/$MYSQL_PILER_PASSWORD/g" -e "s/piler.yourdomain.com/$PILER_HOSTNAME/g" /etc/piler/piler.conf.dist > /etc/piler/piler.conf
chmod 600 /etc/piler/piler.conf
chown $PILER_USER:$PILER_USER /etc/piler/piler.conf
fi
cp /etc/piler/manticore.conf.dist /etc/piler/manticore.conf
sed -i -e "s/MYSQL_HOSTNAME/${MYSQL_HOSTNAME}/g" \
-e "s/MYSQL_DATABASE/${MYSQL_DATABASE}/g" \
-e "s/MYSQL_USERNAME/${MYSQL_USERNAME}/g" \
-e "s/MYSQL_PASSWORD/${MYSQL_PILER_PASSWORD}/g" \
/etc/piler/manticore.conf
}
create_run_piler() {
cat <<EOF > /etc/systemd/system/pilerrun.service
[Unit]
Description=Create piler directory in /var/run
After=network.target
[Service]
Type=simple
ExecStartPre=-/usr/bin/mkdir /var/run/piler
ExecStart=/usr/bin/chown piler:piler /var/run/piler
Restart=on-abort
[Install]
WantedBy=multi-user.target
EOF
systemctl start pilerrun.service
systemctl enable pilerrun.service
}
install_prerequisites
install_manticore
create_user
install_piler
create_mysql_user_and_database
start_mysql
create_my_cnf "root" "${MYSQL_ROOT_PASSWORD}" /etc/piler/.my.cnf-root
create_my_cnf "piler" "${MYSQL_PILER_PASSWORD}" /etc/piler/.my.cnf
fix_configs
fix_config_site_php
add_systemd_services
create_cipher_key
create_run_piler
systemctl start pilersearch
systemctl start piler
systemctl start piler-smtp
@gkwurst
Copy link
Author

gkwurst commented Sep 27, 2024

your script works perfectly 👌

Glad it worked for you!

@cubanlinux
Copy link

I recently installed it on a clean Ubuntu 24.04 server and it gave me an error because the unzip package was not installed. It would be good if you added the unzip package in the installation of packages and dependencies.

@gkwurst
Copy link
Author

gkwurst commented Oct 26, 2024

I recently installed it on a clean Ubuntu 24.04 server and it gave me an error because the unzip package was not installed. It would be good if you added the unzip package in the installation of packages and dependencies.

Done.

@wclemo
Copy link

wclemo commented Dec 10, 2024 via email

@ckruijntjens
Copy link

Hi. I am not so familiar with Docker install, but do you know which underlying OS was installed ? In my case when I installed on Debian it the webpage wasn't initially accessible.  But then I discovered that Debian 12 installs php8.2, but the script specified php8.3. I modified all  script's php entries to php8.2. Then on the Nginx config itself I also had to modify: fastcgi_pass unix:/run/php/php8.3-fpm.sock; to fastcgi_pass unix:/run/php/php8.2-fpm.sock; Regards, Clement On Tuesday, December 10, 2024, 12:58:17 AM GMT+3, Ryan Harris @.***> wrote: @ShiftyMcCool commented on this gist. Hello! I ran the script and everything finished successfully and the services are running. However, when I attempt to hit the UI at port 80 in my browser, I get a generic nginx page. Am I doing something wrong? I've only ever run the docker version of Mail Piler so I'm guessing it's my fault :P Thanks! — Reply to this email directly, view it on GitHub or unsubscribe. You are receiving this email because you are subscribed to this thread. Triage notifications on the go with GitHub Mobile for iOS or Android.

For me the same problem.Only default nginx page is available.

@k0stett
Copy link

k0stett commented Feb 21, 2025

Nice script, but package libcurl4-openssl-dev required by piler building process but not included in this script.

@k0stett
Copy link

k0stett commented Mar 7, 2025

For those who trying to import mail from imap.yandex.com - you need to change regex in /usr/libexec/piler/imapfetch.py:58
Old str: f = re.split(r' \"[\/\.\\]+\" ', folder)
New str: f = re.split(r'\"\|\"\s*(\S+)', folder)

@timiajayi
Copy link

I Added libcurl4-openssl-dev to the install and checks for file existence before attempting operations so you can continue where left off , and completion message , how do you add the updated code?

@gkwurst
Copy link
Author

gkwurst commented Mar 26, 2025

I added libcurl4-openssl-dev to the prerequisites. I didn't have an issue on my installs, but can't hurt much to add it if some distribution needs it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment