Installing from the ZIP package

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.
Do not enable 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.
There is no middle ground on 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.
Tip: if a file upload fails with no explanation although the file is below the displayed limit, it is almost always 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
  1. Download Apache 2.4 for Windows (VS17 x64) from apachelounge.com and extract it into C:\ppowa-64S\httpd-2.4\.
  2. Download PHP 8.2.x Thread Safe x64 from windows.php.net and extract it into C:\ppowa-64S\php-8.2.17\.
  3. Install the matching Visual C++ Redistributable, required by both Apache and PHP.
  4. Copy php.ini-production to php.ini and add the lines below, on top of the settings from step 3.
Important: PHP must be the Thread Safe build, because it is loaded as an Apache module. IIS requires the Non-Thread-Safe build instead.
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.

Tip: the PATH is only read when a process starts. Apache must be restarted after the PATH is changed, otherwise OCI8 will not find the Oracle DLLs — and the error will not say so clearly.

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.
Back these up together: 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

  1. The login page appears, style sheets included.
  2. You can log in and change the admin password.
  3. In Administration » Modules, enable the modules you need. A module whose PHP extension is missing will say so when you enable it.
  4. 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.
  5. Check that log\app.log is 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.

You are ready. The SQLite database and the encryption key are created on first access. Log in, change the default account, then configure your databases and authentication.