Installation guide
Installing from the ZIP package
From the archive to your first login, on Red Hat / Oracle Linux, Ubuntu / Debian
or Windows — including every PHP extension and how to configure it.
Requirements
| Operating system | RHEL / Oracle Linux 8-9 (Rocky, AlmaLinux), Ubuntu 22.04+ / Debian 12+, or Windows 10 / Server 2016+ |
| PHP | 8.2 or later |
| Web server | Apache 2.4 (PHP module or PHP-FPM). Nginx and IIS work just as well — see the dedicated guides at the bottom of this page. |
| Database | None to install. The application uses SQLite, which ships with PHP. |
| Internet access | Not needed at runtime if you pick the Portable package (see step 1) |
| The package | sw_pkg_*.zip archive (see step 1) |
1. Get the package
The installation package is available for download on this site’s Download page. Pick the archive that matches your needs:
- CDN — JavaScript libraries are loaded from the Internet. Small archive, but whoever browses the application needs Internet access.
- Portable — libraries are bundled in. Larger archive, no Internet access needed at runtime. This is the one to pick for an air-gapped network.
The sw_pkg_*.zip archive holds mon-appli\ (the web root), lib\, docs\, and a minimal securite\database.sqlite pre-filled with the title, theme and library URLs. It carries no secret — no database password, no encryption key.
2. PHP extensions
The list below comes from the application’s own source code. It separates what is mandatory from what only matters if you enable a given module — there is no point installing the Oracle Instant Client, several hundred megabytes, on a server that will never see an Oracle database.
Mandatory core — without these, the application either will not start or loses an essential function.
| sqlite3 | The application’s own database: users, roles, settings, database registry. | The native SQLite3 class. Shipped by php-common on RHEL, by php8.2-sqlite3 on Debian. |
| sodium | At-rest encryption of every stored password: Oracle and PostgreSQL databases, CMDB, LDAP service account, OAuth secret. | Nothing to tune. Built into PHP 8.2 core on Debian; php-sodium package on RHEL; must be uncommented on Windows. |
| mbstring | UTF-8 string handling: seven-language interface, truncation of SQL texts and file previews. | Nothing to tune. |
| zip | Updating a module from a ZIP, exporting a module, building the package, reading audit archives. | Nothing to tune. |
| dom | Rendering of the built-in documentation portal (Markdown to HTML). | php-xml on RHEL, php8.2-xml on Debian. |
| fileinfo | Checks the real type of every uploaded file — audit archives, module ZIPs, logo. This is what stops a file from lying about its extension. | Built in by default on Linux; must be uncommented on Windows. |
| session json |
Application sessions and data exchange with the interface. | Compiled into PHP 8 by default: nothing to do. |
| openssl | Encrypted transport: e-mail over TLS or SSL, directory over LDAPS. | Required as soon as SMTP uses TLS/SSL or the directory uses LDAPS. Without it, only cleartext connections work. |
Depending on the modules you enable — only install these if the matching module is of use to you.
| oci8 | Oracle module, plus the CMDB and CNP modules that build on it. | Requires the Oracle Instant Client 19c, installed separately, with its libraries declared to the system (see the per-platform steps). |
| pgsql | PostgreSQL module. | The native pgsql extension, not pdo_pgsql. No external client to install. |
| ldap | LDAP / Active Directory authentication, and the CNP module. | For LDAPS, make sure the certificate authority is trusted by the system. |
| gd | Custom logo and favicon. | Optional: without it image uploads are simply refused, everything else works. |
| simplexml | Reading detailed Oracle execution plans (SQL profiles, adaptive plans). | Same package as dom: php-xml or php8.2-xml. |
| phar | Reading audit archives compressed as .tgz. |
Enabled by default. phar.readonly = On does not prevent reading: leave that setting alone. |
| zlib | Compression of rotated log files by the scheduled command-line jobs. | Optional: without it logs still rotate, just uncompressed. |
pdo_sqlite or pdo_pgsql. The application does not use PDO but the native SQLite3 and pgsql extensions. Installing PDO breaks nothing, it simply achieves nothing.
sodium. At-rest encryption refuses to run without it, and says so plainly: PHP sodium extension required for at-rest encryption. No database password can be saved at all.
By contrast, curl, intl, exif, sockets, bz2, gmp, gettext and imap are never used by the application, whichever modules you enable: turning them on achieves nothing. Some of them still appear in older installation procedures.
3. php.ini settings
These values suit a typical instance. Each one answers a specific need of the application.
; --- Encoding and time zone ---
default_charset = "UTF-8" ; seven-language interface
date.timezone = "Europe/Paris" ; timestamps in logs and reports
; --- File uploads ---
; Audit archives, module update ZIPs, Oracle wallets.
; post_max_size must stay LARGER than upload_max_filesize, otherwise the
; upload is rejected before it even reaches the application, with no
; useful message.
upload_max_filesize = 64M
post_max_size = 72M
; --- Resources ---
memory_limit = 256M ; large reports, archive reading
max_execution_time = 300 ; long collections and exports
; --- Outbound network access ---
; Required for OAuth authentication and for building a Portable package.
; The application does not use curl: without this setting, both of these
; fail silently.
allow_url_fopen = On
; --- Sessions ---
session.use_strict_mode = 1
; No need to set gc_maxlifetime, cookie_httponly or cookie_samesite here:
; the application sets them itself when starting the session, from its own
; lifetime setting.
; --- Logging ---
; The application already forces display_errors to Off and log_errors to On.
; Only the log destination is worth setting here.
error_log = /var/log/php/error.log
Two directives deserve particular care, because they break features without any clear message:
| open_basedir | Leave it empty, or include the package root and the system temporary directory. The application writes outside the web root (securite\, log\) and uses the temporary directory to build archives. |
| disable_functions | Blocking exec and shell_exec disables the Batch and scheduling page, which reads and writes the crontab (or Windows scheduled tasks). Nothing else depends on them. |
post_max_size being too low, or an Apache LimitRequestBody directive.
4. Linux Red Hat / Oracle Linux
Applies to RHEL 8 and 9, Oracle Linux, Rocky and AlmaLinux.
# Enable PHP 8.2 (RHEL 9 / OL 9)
sudo dnf module reset php
sudo dnf module enable php:8.2
# RHEL 8: Remi repository, then "sudo dnf module enable php:remi-8.2"
# Apache, PHP and the mandatory core
sudo dnf install -y httpd php php-cli php-common \
php-mbstring php-sodium php-zip php-xml php-process
# Depending on the modules you enable
sudo dnf install -y php-ldap php-gd php-pgsql
php-process provides exec and shell_exec, which the Batch page needs to write the crontab. fileinfo is built in by default.
sqlite3 is shipped by php-common: there is no php-sqlite3 package to install on RHEL.
For the Oracle module only, add the Instant Client and build OCI8:
sudo dnf install -y oracle-instantclient-basic oracle-instantclient-devel
# or install the RPMs downloaded from oracle.com
# Declare the libraries to the linker
echo "/usr/lib/oracle/19.25/client64/lib" | \
sudo tee /etc/ld.so.conf.d/oracle-instantclient.conf
sudo ldconfig
# Build the extension
sudo dnf install -y php-devel php-pear gcc make
sudo pecl install oci8-3.3.0
# at the prompt: instantclient,/usr/lib/oracle/19.25/client64/lib
echo "extension=oci8.so" | sudo tee /etc/php.d/30-oci8.ini
SELinux being enforcing by default, allow Apache to write into the application’s working directories:
sudo setsebool -P httpd_can_network_connect 1
sudo chown -R apache:apache /opt/app/securite /opt/app/log
sudo chmod 750 /opt/app/securite
sudo restorecon -R /opt/app
Then move on to step 7.
5. Linux Ubuntu / Debian
sudo apt update
# PHP 8.2 if your distribution does not ship it
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
# Apache, PHP and the mandatory core
sudo apt install -y apache2 libapache2-mod-php8.2 \
php8.2 php8.2-cli php8.2-mbstring php8.2-sqlite3 \
php8.2-zip php8.2-xml
# Depending on the modules you enable
sudo apt install -y php8.2-ldap php8.2-gd php8.2-pgsql
sodium is built into PHP 8.2 core on Debian and Ubuntu: no package to install, no line to add.
For the Oracle module only:
sudo apt install -y libaio1 unzip php8.2-dev php-pear gcc make
sudo mkdir -p /opt/oracle
sudo unzip instantclient-basic-linux.x64-19.25*.zip -d /opt/oracle
sudo unzip instantclient-sdk-linux.x64-19.25*.zip -d /opt/oracle
echo "/opt/oracle/instantclient_19_25" | \
sudo tee /etc/ld.so.conf.d/oracle-instantclient.conf
sudo ldconfig
sudo pecl install oci8-3.3.0
# at the prompt: instantclient,/opt/oracle/instantclient_19_25
echo "extension=oci8.so" | sudo tee /etc/php/8.2/mods-available/oci8.ini
sudo phpenmod oci8
Permissions on the working directories:
sudo chown -R www-data:www-data /opt/app/securite /opt/app/log
sudo chmod 750 /opt/app/securite
Then move on to step 7.
6. Windows with ppowa
The Windows installation relies on a portable layout: Apache and PHP side by side, with no installer and no imposed system service.
C:\ppowa-64S\
├── httpd-2.4\ Apache server
│ └── conf\httpd.conf
├── php-8.2.17\ PHP interpreter
│ ├── php.ini
│ ├── php8apache2_4.dll
│ └── ext\
└── my-app\ the unpacked package
├── mon-appli\ web root (DocumentRoot)
├── lib\
├── securite\ outside the web root
└── log\ outside the web root
- Download Apache 2.4 for Windows (VS17 x64) from apachelounge.com and extract it into
C:\ppowa-64S\httpd-2.4\. - Download PHP 8.2.x Thread Safe x64 from windows.php.net and extract it into
C:\ppowa-64S\php-8.2.17\. - Install the matching Visual C++ Redistributable, required by both Apache and PHP.
- Copy
php.ini-productiontophp.iniand add the lines below, on top of the settings from step 3.
extension_dir = "C:/ppowa-64S/php-8.2.17/ext"
; Mandatory core
extension=sqlite3
extension=sodium
extension=mbstring
extension=zip
extension=openssl
extension=xml
extension=fileinfo
; Depending on the modules you enable
extension=oci8_19 ; Oracle module (Instant Client 19c required)
extension=pgsql ; PostgreSQL module
extension=ldap ; LDAP / Active Directory authentication
extension=gd ; custom logo and favicon
Configure Apache in C:\ppowa-64S\httpd-2.4\conf\httpd.conf:
Define SRVROOT "C:/ppowa-64S/httpd-2.4"
ServerRoot "${SRVROOT}"
Listen 80
# Load PHP as a module
PHPIniDir "C:/ppowa-64S/php-8.2.17"
AddHandler application/x-httpd-php .php
LoadModule php_module "C:/ppowa-64S/php-8.2.17/php8apache2_4.dll"
# Web root = the mon-appli subfolder of the package
DocumentRoot "C:/ppowa-64S/my-app/mon-appli"
<Directory "C:/ppowa-64S/my-app/mon-appli">
Options +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
For the Oracle module only: download the Instant Client Basic 19c 64-bit from oracle.com, extract it into C:\oracle\instantclient_19_25\, and add that folder to the system PATH.
7. Deploy the package
Transfer the archive to the server, then extract it.
# Linux
scp sw_pkg_*_portable.zip user@server:/tmp/
sudo mkdir -p /opt/app
sudo unzip /tmp/sw_pkg_*_portable.zip -d /opt/app
# Windows: extract into C:\ppowa-64S\my-app\
The web root is the mon-appli subfolder, and nothing else. The securite\ folder (SQLite database and encryption key) and log\ stay outside the web root: they are never reachable over HTTP.
Under Apache, URL rewriting must be active: check that mod_rewrite is loaded and that AllowOverride All is set on the directory, otherwise the .htaccess file shipped with the application is ignored.
8. First login
Start the web server and open the application in a browser. On first access, the application creates its full database schema and its encryption key.
| Username | admin |
| Password | admin123 |
| First thing to do | Change that password immediately. |
securite\master.key and securite\database.sqlite. The key decrypts the passwords held in the database: backing up one without the other makes every secret unrecoverable.
9. Check the installation
- The login page appears, style sheets included.
- You can log in and change the
adminpassword. - In Administration » Modules, enable the modules you need. A module whose PHP extension is missing will say so when you enable it.
- Declare a database and run a connection test: this is the most telling check of all, as it exercises the extension, the client and the network in one go.
- Check that
log\app.logis filling up. If the file stays empty or missing, revisit the write permissions.
If you get a blank page, the answer is in the PHP error log, not in the browser: display_errors is Off in production.
