Add Piler email archiving support and update scripts

Introduces Piler email archiving with new install and container scripts, and adds metadata for frontend integration. Updates Pixelfed and Postgresus install scripts to improve PHP-FPM pool configuration and streamline build steps.
This commit is contained in:
CanbiZ 2025-12-15 11:26:46 +01:00
parent 179142fd5c
commit a3ba39b9de
5 changed files with 414 additions and 8 deletions

88
ct/piler.sh Normal file
View File

@ -0,0 +1,88 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://www.mailpiler.org/
APP="Piler"
var_tags="${var_tags:-email;archive;smtp}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/piler/piler.conf ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE_NEW=$(curl -fsSL https://www.mailpiler.org/download.php | grep -oP 'piler-\K[0-9]+\.[0-9]+\.[0-9]+' | head -1)
RELEASE_OLD=$(pilerd -v 2>/dev/null | grep -oP 'version \K[0-9]+\.[0-9]+\.[0-9]+' || echo "unknown")
if [[ "${RELEASE_NEW}" != "${RELEASE_OLD}" ]]; then
msg_info "Stopping Piler Services"
$STD systemctl stop piler
$STD systemctl stop manticore
msg_ok "Stopped Piler Services"
msg_info "Backing up Configuration"
cp /etc/piler/piler.conf /tmp/piler.conf.bak
msg_ok "Backed up Configuration"
msg_info "Updating to v${RELEASE_NEW}"
cd /tmp
curl -fsSL "https://bitbucket.org/jsuto/piler/downloads/piler-${RELEASE_NEW}.tar.gz" -o piler.tar.gz
tar -xzf piler.tar.gz
cd "piler-${RELEASE_NEW}"
$STD ./configure \
--localstatedir=/var \
--with-database=mysql \
--sysconfdir=/etc/piler \
--enable-memcached
$STD make
$STD make install
$STD ldconfig
cd /tmp && rm -rf "piler-${RELEASE_NEW}" piler.tar.gz
msg_ok "Updated to v${RELEASE_NEW}"
msg_info "Restoring Configuration"
cp /tmp/piler.conf.bak /etc/piler/piler.conf
rm -f /tmp/piler.conf.bak
chown piler:piler /etc/piler/piler.conf
msg_ok "Restored Configuration"
msg_info "Starting Piler Services"
$STD systemctl start manticore
$STD systemctl start piler
msg_ok "Started Piler Services"
msg_ok "Updated Successfully to v${RELEASE_NEW}"
else
msg_ok "No update available (current: v${RELEASE_OLD})"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"

View File

@ -0,0 +1,23 @@
{
"name": "Piler",
"slug": "piler",
"categories": [
"Email",
"Archive"
],
"date_created": "2025-12-15",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": "80",
"documentation": "https://www.mailpiler.org/",
"website": "https://www.mailpiler.org/",
"logo": "https://www.mailpiler.org/piler-logo.png",
"description": "Piler is a feature rich open source email archiving solution with support for legal hold, deduplication, full text search, and many more features.",
"install_methods": [
{
"type": "default",
"script": "ct/piler.sh"
}
]
}

298
install/piler-install.sh Normal file
View File

@ -0,0 +1,298 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://www.mailpiler.org/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
nginx \
openssl \
libtre5 \
catdoc \
poppler-utils \
unrtf \
tnef \
clamav \
clamav-daemon \
memcached \
sysstat \
python3 \
python3-mysqldb
msg_ok "Installed Dependencies"
import_local_ip
setup_mariadb
MARIADB_DB_NAME="piler" MARIADB_DB_USER="piler" setup_mysql_db
PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="ldap,gd,memcached,pdo,mysql,curl,zip" setup_php
msg_info "Installing Manticore Search"
curl -fsSL https://repo.manticoresearch.com/manticore-repo.noarch.deb -o /tmp/manticore-repo.deb
$STD dpkg -i /tmp/manticore-repo.deb
$STD apt update
$STD apt install -y manticore manticore-extra
rm -f /tmp/manticore-repo.deb
msg_ok "Installed Manticore Search"
msg_info "Installing Piler"
VERSION="1.4.8"
cd /tmp
curl -fsSL "https://github.com/jsuto/piler/releases/download/piler-${VERSION}/piler_${VERSION}-bookworm_amd64.deb" -o piler.deb
curl -fsSL "https://github.com/jsuto/piler/releases/download/piler-${VERSION}/piler-webui_${VERSION}-bookworm_amd64.deb" -o piler-webui.deb
$STD dpkg -i piler.deb
$STD apt-get -f install -y
$STD dpkg -i piler-webui.deb
$STD apt-get -f install -y
rm -f piler.deb piler-webui.deb
msg_ok "Installed Piler v${VERSION}"
msg_info "Configuring Piler Database"
cd /usr/local/share/piler
mysql -u root "${MARIADB_DB_NAME}" <db-mysql.sql
msg_ok "Configured Piler Database"
msg_info "Configuring Piler"
PILER_KEY=$(openssl rand -hex 16)
cat <<EOF >/etc/piler/piler.conf
hostid=piler.${LOCAL_IP}.nip.io
update_counters_to_memcached=1
mysql_hostname=localhost
mysql_database=${MARIADB_DB_NAME}
mysql_username=${MARIADB_DB_USER}
mysql_password=${MARIADB_DB_PASS}
mysql_socket=/var/run/mysqld/mysqld.sock
archive_dir=/var/piler/store
data_dir=/var/piler
tmp_dir=/var/piler/tmp
listen_addr=0.0.0.0
listen_port=25
encrypt_messages=1
key=${PILER_KEY}
iv=0123456789ABCDEF
memcached_servers=127.0.0.1
enable_clamav=1
clamd_socket=/var/run/clamav/clamd.ctl
spam_header_line=X-Spam-Status: Yes
verbosity=1
EOF
chown piler:piler /etc/piler/piler.conf
chmod 640 /etc/piler/piler.conf
chown -R piler:piler /var/piler
chmod 750 /var/piler
msg_ok "Configured Piler"
msg_info "Configuring Manticore Search"
cat <<EOF >/etc/manticoresearch/manticore.conf
searchd {
listen = 9306:mysql
listen = 9312
listen = 9308:http
log = /var/log/manticore/searchd.log
query_log = /var/log/manticore/query.log
pid_file = /var/run/manticore/searchd.pid
binlog_path = /var/lib/manticore/data
}
source piler1 {
type = mysql
sql_host = localhost
sql_user = ${MARIADB_DB_USER}
sql_pass = ${MARIADB_DB_PASS}
sql_db = ${MARIADB_DB_NAME}
sql_port = 3306
sql_query = SELECT id, from_addr, to_addr, subject, body, sent FROM metadata
sql_attr_timestamp = sent
}
index piler1 {
source = piler1
path = /var/piler/manticore/piler1
min_word_len = 1
charset_table = 0..9, A..Z->a..z, a..z, U+00E1, U+00E9
}
index tag1 {
type = rt
path = /var/piler/manticore/tag1
rt_field = tag
rt_attr_uint = uid
}
index note1 {
type = rt
path = /var/piler/manticore/note1
rt_field = note
rt_attr_uint = uid
}
EOF
mkdir -p /var/log/manticore
chown -R manticore:manticore /var/log/manticore
chown -R piler:piler /var/piler/manticore
msg_ok "Configured Manticore Search"
msg_info "Creating Piler Service"
cat <<EOF >/etc/systemd/system/piler.service
[Unit]
Description=Piler Email Archiving
After=network.target mysql.service manticore.service
Requires=mysql.service manticore.service
[Service]
Type=forking
User=piler
Group=piler
ExecStart=/usr/local/sbin/pilerd -c /etc/piler/piler.conf
PIDFile=/var/piler/pilerd.pid
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
$STD systemctl daemon-reload
$STD systemctl enable --now manticore
$STD systemctl enable --now memcached
$STD systemctl enable --now clamav-daemon
$STD systemctl enable --now piler
msg_ok "Created Piler Service"
msg_info "Configuring PHP-FPM Pool"
cp /etc/php/8.4/fpm/pool.d/www.conf /etc/php/8.4/fpm/pool.d/piler.conf
sed -i 's/\[www\]/[piler]/' /etc/php/8.4/fpm/pool.d/piler.conf
sed -i 's/^user = www-data/user = piler/' /etc/php/8.4/fpm/pool.d/piler.conf
sed -i 's/^group = www-data/group = piler/' /etc/php/8.4/fpm/pool.d/piler.conf
sed -i 's|^listen = .*|listen = /run/php/php8.4-fpm-piler.sock|' /etc/php/8.4/fpm/pool.d/piler.conf
$STD systemctl restart php8.4-fpm
msg_ok "Configured PHP-FPM Pool"
msg_info "Configuring Piler Web GUI"
cd /var/www/piler
cat <<EOF >/var/www/piler/config-site.php
<?php
\$config['SITE_NAME'] = 'Piler Email Archive';
\$config['SITE_URL'] = 'http://${LOCAL_IP}';
\$config['DB_DRIVER'] = 'mysql';
\$config['DB_HOSTNAME'] = 'localhost';
\$config['DB_DATABASE'] = '${MARIADB_DB_NAME}';
\$config['DB_USERNAME'] = '${MARIADB_DB_USER}';
\$config['DB_PASSWORD'] = '${MARIADB_DB_PASS}';
\$config['SPHINX_DATABASE'] = 'mysql:host=127.0.0.1;port=9306;charset=utf8mb4';
\$config['ENABLE_SAAS'] = 0;
\$config['SESSION_NAME'] = 'piler_session';
\$config['SITE_KEYWORDS'] = 'piler, email archive';
\$config['SITE_DESCRIPTION'] = 'Piler email archiving';
\$config['SMTP_DOMAIN'] = '${LOCAL_IP}';
\$config['SMTP_FROMADDR'] = 'no-reply@${LOCAL_IP}';
\$config['ADMIN_EMAIL'] = 'admin@local';
\$config['ADMIN_PASSWORD'] = '\$1\$PXDhp7Bo\$KlEEURhLLphAEa4w.lj1N0';
\$config['MEMCACHED_ENABLED'] = 1;
\$config['MEMCACHED_PREFIX'] = 'piler';
\$config['MEMCACHED_TTL'] = 3600;
\$config['DIR_BASE'] = '/var/www/piler';
\$config['DIR_ATTACHMENT'] = '/var/piler/store';
\$config['ENCRYPTION_KEY'] = '${PILER_KEY}';
\$config['ENCRYPTION_IV'] = '0123456789ABCDEF';
\$config['DEFAULT_RETENTION_DAYS'] = 2557;
\$config['RESTRICTED_AUDITOR'] = 0;
\$config['ENABLE_LDAP_AUTH'] = 0;
\$config['ENABLE_IMAP_AUTH'] = 0;
\$config['ENABLE_POP3_AUTH'] = 0;
\$config['ENABLE_SSO_AUTH'] = 0;
\$config['HEADER_LINE_TO_HIDE'] = 'X-Envelope-To:';
?>
EOF
chown -R piler:piler /var/www/piler
chmod 755 /var/www/piler
msg_ok "Installed Piler Web GUI"
msg_info "Configuring Nginx"
cat <<EOF >/etc/nginx/sites-available/piler
server {
listen 80;
server_name _;
root /var/www/piler;
index index.php;
access_log /var/log/nginx/piler-access.log;
error_log /var/log/nginx/piler-error.log;
charset utf-8;
location / {
try_files \$uri \$uri/ /index.php?\$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm-piler.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html|woff|woff2)$ {
access_log off;
expires max;
}
location ~ /\.ht {
deny all;
}
}
EOF
ln -sf /etc/nginx/sites-available/piler /etc/nginx/sites-enabled/piler
rm -f /etc/nginx/sites-enabled/default
$STD nginx -t
$STD systemctl enable --now nginx
msg_ok "Configured Nginx"
msg_info "Setting Up Cron Jobs"
cat <<EOF >/etc/cron.d/piler
30 6 * * * piler /usr/local/libexec/piler/indexer.delta.sh
30 7 * * * piler /usr/local/libexec/piler/indexer.main.sh
*/15 * * * * piler /usr/local/bin/pilerstat
30 2 * * * piler /usr/local/bin/pilerpurge
3 * * * * piler /usr/local/bin/pilerconf
EOF
msg_ok "Set Up Cron Jobs"
motd_ssh
customize
cleanup_lxc

View File

@ -43,13 +43,12 @@ systemctl restart redis-server
msg_ok "Redis configured"
msg_info "Configuring PHP-FPM Pool"
mkdir -p /run/php-fpm
cp /etc/php/8.4/fpm/pool.d/www.conf /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's/\[www\]/[pixelfed]/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's/^user = www-data/user = pixelfed/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's/^group = www-data/group = pixelfed/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's|^listen = .*|listen = /run/php-fpm/pixelfed.sock|' /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's/^listen.owner = .*/listen.owner = pixelfed/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's|^listen = .*|listen = /run/php/php8.4-fpm-pixelfed.sock|' /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's/^listen.owner = .*/listen.owner = www-data/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
sed -i 's/^listen.group = .*/listen.group = www-data/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
systemctl restart php8.4-fpm
msg_ok "PHP-FPM Pool configured"
@ -75,6 +74,7 @@ sed -i "s|REDIS_PORT=.*|REDIS_PORT=6379|" .env
sed -i "s|ACTIVITY_PUB=.*|ACTIVITY_PUB=true|" .env
sed -i "s|AP_REMOTE_FOLLOW=.*|AP_REMOTE_FOLLOW=true|" .env
sed -i "s|OAUTH_ENABLED=.*|OAUTH_ENABLED=true|" .env
echo "SESSION_SECURE_COOKIE=false" >>.env
chown -R pixelfed:pixelfed /opt/pixelfed
chmod -R 755 /opt/pixelfed
@ -122,7 +122,7 @@ server {
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php-fpm/pixelfed.sock;
fastcgi_pass unix:/run/php/php8.4-fpm-pixelfed.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

View File

@ -26,16 +26,13 @@ NODE_VERSION="24" setup_nodejs
fetch_and_deploy_gh_release "postgresus" "RostislavDugin/postgresus" "tarball" "latest" "/opt/postgresus"
msg_info "Building Postgresus (Patience)"
# Build frontend
cd /opt/postgresus/frontend
$STD npm ci
$STD npm run build
# Build backend
cd /opt/postgresus/backend
$STD go mod tidy
$STD go mod download
$STD CGO_ENABLED=0 go build -o /opt/postgresus/postgresus ./cmd/main.go
CGO_ENABLED=0 go build -o postgresus .
mkdir -p /opt/postgresus/{data,backups,logs}
cp -r /opt/postgresus/frontend/dist /opt/postgresus/ui
cp -r /opt/postgresus/backend/migrations /opt/postgresus/