User Tools

Site Tools


servers:linux:nginx:piwigo

This is an old revision of the document!


Information

Prerequisites

Dependencies

Download Source

sudo git clone --branch 'master' --depth '1' --recurse-submodules 'https://github.com/Piwigo/Piwigo.git' '/var/www/media' && sudo chown -R 'www-data':'www-data' '/var/www/media' && sudo chmod -R '0755' '/var/www/media'
sudo git clone --branch 'master' --depth '1' --recurse-submodules 'https://github.com/Piwigo/piwigo-bootstrap-darkroom.git' '/var/www/media/themes/bootstrap_darkroom' && sudo chown -R 'www-data':'www-data' '/var/www/media/themes' && sudo chmod -R '0755' '/var/www/media/themes'

Database

sudo mariadb
CREATE DATABASE piwigo;
CREATE USER 'piwigo'@'localhost' IDENTIFIED BY 'x';
GRANT ALL PRIVILEGES ON piwigo.* to 'piwigo'@'localhost';
FLUSH PRIVILEGES;EXIT;

nginx + PHP-FPM Configuration

PHP-FPM Socket

sudo -e '/etc/php/8.4/fpm/pool.d/media.conf' && sudo systemctl restart 'php8.4-fpm'
[media]

; User/Group
user = "www-data"
group = "www-data"

; Socket
listen = "/run/php/media.sock"
listen.owner = "www-data"
listen.group = "www-data"
listen.mode = "0662"

; Process Management
pm = "ondemand"
pm.max_children = "4"
pm.process_idle_timeout = "30"

; Logging
php_value[log_errors] = "0"
php_value[error_reporting] = "~E_ALL"

; General
php_value[date.timezone] = "America/New_York"

; Piwigo
php_value[max_execution_time] = "200"
php_value[memory_limit] = "512M"
php_value[post_max_size] = "100M"
php_value[upload_max_filesize] = "20M"
php_value[max_file_uploads] = "100"

; End

FastCGI

sudo -e '/etc/nginx/snippets/media.conf'
location '~' '\.(php|phar)(/.*)?$' {

 fastcgi_split_path_info '^(.+\.(?:php|phar))(/.*)$';
 fastcgi_intercept_errors 'on';
 fastcgi_index 'index.php';
 include 'fastcgi_params';
 fastcgi_param 'SCRIPT_FILENAME' '$document_root$fastcgi_script_name';
 fastcgi_param 'PATH_INFO' '$fastcgi_path_info';
 fastcgi_param 'HTTPS' 'on';

 fastcgi_pass 'unix:/run/php/media.sock';

}

# End

Server Block

sudo -e '/etc/nginx/sites-available/media.conf'
server {

 listen '443' 'ssl';
 http2 'on';
 server_name 'media.realmofespionage.xyz';
 root '/var/www/media';
 index 'index.php';

 include '/etc/nginx/snippets/media.conf';
 include '/etc/nginx/snippets/headers.conf';

 client_max_body_size '100M';

# access_log '/var/log/nginx/media-access.log';
# error_log '/var/log/nginx/media-error.log';

 location '/' {
  index 'index.php';
  try_files '$uri $uri/' '@rewrite';
 }

 location '@rewrite' {
  rewrite '^/picture((/|$).*)$' '/picture.php$1' 'last';
  rewrite '^/index((/|$).*)$' '/index.php$1' 'last';
  rewrite '^/i((/|$).*)$' '/i.php$1' 'last';
 }

}

# End
sudo ln -s -f '/etc/nginx/sites-available/media.conf' '/etc/nginx/sites-enabled/media.conf' && sudo systemctl reload 'nginx'

Initial Setup

Settings

  • :!: Use a relay/bogus email address during account creation to protect against potential spam 1)
  • :!: Disable Allow user registration immediately under Configuration → Options → General → Permissions
  • :?: Seemingly have to enable Activate comments in order to prevent broken CSS on the bottom of image pages, but can uncheck Comments for all so that nobody public can leave comments
  • Activate Boostrap Darkroom theme

Page Banner

<p>Tech, hardware, food, nature, and gaming pictures and videos!</p>

config.inc.php

sudo -u 'www-data' -e '/var/www/media/local/config/config.inc.php'
<?php

// nginx Rewrite
$conf['question_mark_in_urls'] = false;
$conf['php_extension_in_urls'] = false;

// Minimal Logging
$conf['log_level'] = 'EMERGENCY';

// Hide PHP Warnings
$conf['show_php_errors'] = E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_WARNING;

// Header Links
$conf['links'] = array(
  'https://realmofespionage.xyz' => 'Realm of Espionage',
  'https://wiki.realmofespionage.xyz' => 'RoE | Wiki',
  'https://blog.realmofespionage.xyz' => 'RoE | Blog',
  'https://wiki.realmofespionage.xyz/user;espionage724' => 'Webmaster Info',
  'https://wiki.realmofespionage.xyz/servers:linux:nginx:piwigo' => 'Instance Configuration Notes',
  );

// Video Uploading
$conf['upload_form_all_types'] = true;

$conf['file_ext'] = array_merge(
  $conf['picture_ext'],
  array('mp4','webmv','m4v','webm','mov')
  );

// End
?>

Scripts

Git Fix

  • :!: Set email for both user.email
sudo mkdir -p '/etc/nginx/scripts/media' && sudo -e '/etc/nginx/scripts/media/git-fix.sh' && sudo chmod '0500' '/etc/nginx/scripts/media/git-fix.sh' && sudo chown 'www-data':'www-data' '/etc/nginx/scripts/media/git-fix.sh'
#!/bin/bash

'/usr/bin/rm' -Rf '/var/www/media/.git'
'/usr/bin/git' -C '/var/www/media' init --initial-branch='master'
'/usr/bin/git' -C '/var/www/media' add '.'

########################################
'/usr/bin/git' -C '/var/www/media' config 'user.email' 'espionage724@x'
########################################

'/usr/bin/git' -C '/var/www/media' commit --message='x'

'/usr/bin/git' -C '/var/www/media' remote add 'origin' 'https://github.com/Piwigo/Piwigo.git'
'/usr/bin/git' -C '/var/www/media' pull --depth '1' --recurse-submodules 'origin' 'master' --rebase

'/usr/bin/git' -C '/var/www/media' reset --hard 'origin/master'
'/usr/bin/git' -C '/var/www/media' gc --aggressive --prune='all'
'/usr/bin/git' -C '/var/www/media' fsck --full --strict

'/usr/bin/rm' -Rf '/var/www/media/themes/bootstrap_darkroom/.git'
'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' init --initial-branch='master'
'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' add '.'

########################################
'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' config 'user.email' 'espionage724@x'
########################################

'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' commit --message='x'

'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' remote add 'origin' 'https://github.com/Piwigo/piwigo-bootstrap-darkroom.git'
'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' pull --depth '1' --recurse-submodules 'origin' 'master' --rebase

'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' reset --hard 'origin/master'
'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' gc --aggressive --prune='all'
'/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' fsck --full --strict

# End
sudo -u 'www-data' '/etc/nginx/scripts/media/git-fix.sh'

Services

Updater

Service

sudo -e '/etc/systemd/system/media-up.service'
[Service]
User=www-data
Group=www-data
Type=oneshot

WorkingDirectory=/var/www/media

ExecStart='/usr/bin/git' -C '/var/www/media' reset --hard
ExecStart='/usr/bin/git' -C '/var/www/media' pull origin 'master' --rebase

ExecStart='/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' reset --hard
ExecStart='/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' pull origin 'master' --rebase

ExecStartPost='/usr/bin/sync'

# End

Timer

  • Daily 01:00:00 AM
sudo -e '/etc/systemd/system/media-up.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'media-up.timer' --now && sudo systemctl start 'media-up' && sudo systemctl status 'media-up' -l
[Unit]
Description=Piwigo Git Updater
After=network-online.target
Wants=network-online.target

[Timer]
OnCalendar=*-*-* 01:00:00
Persistent=true

[Install]
WantedBy=timers.target

# End

Backup

Files

Service

mkdir -p ~/'backups' && sudo -e '/etc/systemd/system/media-fb.service' && sudo sed -i 's/CHANGEME/'$USER'/g' '/etc/systemd/system/media-fb.service'
[Service]
Type=oneshot

WorkingDirectory=/var/www/media

ExecStart='/usr/bin/bash' -c '"/usr/bin/tar" -czf "/home/CHANGEME/backups/piwigo-files-auto-"$$(date +%%Y-%%m-%%d)".tar.gz" -C "/var/www" "media"'

ExecStartPost='/usr/bin/sync'

# End

Timer

  • Monthly (2nd) 01:15:00 AM
sudo -e '/etc/systemd/system/media-fb.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'media-fb.timer' --now
[Unit]
Description=Piwigo Files Backup

[Timer]
OnCalendar=*-*-02 01:15:00
Persistent=true

[Install]
WantedBy=timers.target

# End
sudo systemctl start 'media-fb' && sudo systemctl status 'media-fb' -l

Database

Database Auth

sudo mkdir -p '/var/lib/mysql/auth' && sudo -e '/var/lib/mysql/auth/piwigo' && sudo chown 'mysql':'mysql' '/var/lib/mysql/auth/piwigo' && sudo chmod '0600' '/var/lib/mysql/auth/piwigo'
[mariadb-dump]
user=piwigo
password=x

# End

Service

mkdir -p ~/'backups' && sudo mkdir -p '/var/lib/mysql/tmp' && sudo -e '/etc/systemd/system/media-db.service' && sudo sed -i 's/'CHANGEME'/'$USER'/g' '/etc/systemd/system/media-db.service'
[Service]
Group=mysql
Type=oneshot

WorkingDirectory=/var/lib/mysql

ExecStart='/usr/bin/bash' -c '"/usr/bin/mariadb-dump" --defaults-extra-file="/var/lib/mysql/auth/piwigo" --single-transaction --quick "piwigo" -r "/home/CHANGEME/backups/piwigo-database-auto-"$$(date +%%Y-%%m-%%d)".sql"'

ExecStartPost='/usr/bin/sync'

# End

Timer

  • Monthly (2nd) 01:10:00 AM
sudo -e '/etc/systemd/system/media-db.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'media-db.timer' --now && sudo systemctl start 'media-db' && sudo systemctl status 'media-db' -l
[Unit]
Description=Piwigo Database Backup
After=mariadb.service

[Timer]
OnCalendar=*-*-02 01:10:00
Persistent=true

[Install]
WantedBy=timers.target

# End

Maintenance

Service

sudo -e '/etc/systemd/system/media-m.service'
[Service]
User=www-data
Group=www-data
Type=oneshot

WorkingDirectory=/var/www/media

ExecStart='/usr/bin/git' -C '/var/www/media' gc --aggressive --prune='all'
ExecStart='/usr/bin/git' -C '/var/www/media' fsck --full --strict

ExecStart='/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' gc --aggressive --prune='all'
ExecStart='/usr/bin/git' -C '/var/www/media/themes/bootstrap_darkroom' fsck --full --strict

ExecStartPost='/usr/bin/sync'

# End

Timer

  • Monthly (2nd) 01:30:00 AM
sudo -e '/etc/systemd/system/media-m.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'media-m.timer' --now
[Unit]
Description=Piwigo Maintenance
After=network-online.target
Wants=network-online.target

[Timer]
OnCalendar=*-*-02 01:30:00
Persistent=true

[Install]
WantedBy=timers.target

# End
sudo systemctl start 'media-m' && sudo systemctl status 'media-m' -l

Backup

Files

sudo tar -czf ~/'piwigo-files-manual-'$(date +%Y-%m-%d)'.tar.gz' -C '/var/www' 'media'

Database

sudo mariadb-dump --single-transaction --quick 'piwigo' -r ~/'piwigo-database-manual-'$(date +%Y-%m-%d)'.sql'

scp

scp espionage724@192.168.1.152:~/'piwigo-files-'*'.tar.gz' ~/'Downloads'
scp espionage724@192.168.1.152:~/'piwigo-database-'*'.sql' ~/'Downloads'

Restore

scp

scp ~/'Downloads/piwigo-files-'*'.tar.gz' espionage724@192.168.1.152:~
scp ~/'Downloads/piwigo'*'.sql' espionage724@192.168.1.152:~

Stop nginx

sudo systemctl stop 'nginx'

Remove Existing Files

ls ~/'piwigo-files-'*'.tar.gz' && sudo rm -Rf '/var/www/media'

Restore Files

sudo tar -xzf ~/'piwigo-files-'*'.tar.gz' -C '/var/www' 'media' && sudo chown -R 'www-data':'www-data' '/var/www/media' && sudo chmod -R '0755' '/var/www/media'

Restore Database

sudo mariadb --execute='DROP DATABASE piwigo;'
sudo mariadb --execute='CREATE DATABASE piwigo;'
sudo mariadb 'piwigo' < ~/'piwigo'*'.sql'

Git Fix

  • :!: Set email for user.email
sudo su 'www-data' -s '/bin/bash'
rm -Rf '/var/www/media/.git'
git -C '/var/www/media' init --initial-branch='master'
git -C '/var/www/media' add '.'
git -C '/var/www/media' config 'user.email' 'espionage724@x'
git -C '/var/www/media' commit --message='x'
git -C '/var/www/media' remote add 'origin' 'https://github.com/Piwigo/Piwigo.git'
git -C '/var/www/media' pull --depth '1' --recurse-submodules 'origin' 'master' --rebase
git -C '/var/www/media' reset --hard 'origin/master'
git -C '/var/www/media' gc --aggressive --prune='all'
git -C '/var/www/media' fsck --full --strict

Bootstrap Darkroom

  • :!: Set email for user.email
rm -Rf '/var/www/media/themes/bootstrap_darkroom/.git'
git -C '/var/www/media/themes/bootstrap_darkroom' init --initial-branch='master'
git -C '/var/www/media/themes/bootstrap_darkroom' add '.'
git -C '/var/www/media/themes/bootstrap_darkroom' config 'user.email' 'espionage724@x'
git -C '/var/www/media/themes/bootstrap_darkroom' commit --message='x'
git -C '/var/www/media/themes/bootstrap_darkroom' remote add 'origin' 'https://github.com/Piwigo/piwigo-bootstrap-darkroom.git'
git -C '/var/www/media/themes/bootstrap_darkroom' pull --depth '1' --recurse-submodules 'origin' 'master' --rebase
git -C '/var/www/media/themes/bootstrap_darkroom' reset --hard 'origin/master'
git -C '/var/www/media/themes/bootstrap_darkroom' gc --aggressive --prune='all'
git -C '/var/www/media/themes/bootstrap_darkroom' fsck --full --strict
exit

MySQL Connection

  • Windows uses 127.0.0.1
sudo -u 'www-data' -e '/var/www/media/local/config/database.inc.php'
$conf['db_host'] = 'localhost';

Start nginx

sudo systemctl start 'nginx'

Clean-up

rm -fv ~/'piwigo-files-'*'.tar.gz' ~/'piwigo'*'.sql'

TODOs

  • Show title on pictures (long titles get cut-off in navbar)
  • :?: Below is remaining packages not installed from old installs
sudo dnf install libvorbis poppler-utils
sudo zypper install php8-bz2 php8-zlib
1)
the webmaster URL in the footer shows the email in plaintext and looks tasty to bots
/var/www/wiki/data/attic/servers/linux/nginx/piwigo.1766282192.txt.gz · Last modified: by Sean Rhone

Except where otherwise noted, content on this wiki is licensed under the following license: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki