Use this guide to install the latest FlinkISO updater and then download application updates from within FlinkISO. The updater package replaces three application files; it does not reinstall the server or the application.
unzip instead of PHP ZipArchive.1. How to update the installer
1.1 Ubuntu / Linux: three commands to update the updater
Run these commands in your SSH terminal. Replace /var/www/html/flinkiso with your installation path if it is different. Keep a backup of your existing application files and database before updating.
curl -fL https://www.flinkiso.com/flinkiso-updates/FlinkISO-Updater.zip -o /tmp/FlinkISO-Updater.zip
unzip -o /tmp/FlinkISO-Updater.zip -d /tmp/flinkiso-updater
sudo cp -r /tmp/flinkiso-updater/app/. /var/www/html/flinkiso/app/
Then sign in as an administrator, and click on icon in top menu..
The app/. in the copy command means “copy the contents of app.” This merges the three updater files into the existing application without creating app/app. Your core.php, database settings and uploads are not included in this ZIP.
If curl or unzip is missing on Ubuntu / Debian, install them once:
sudo apt install curl unzip
Copying the files normally does not require an Apache restart. Only use the troubleshooting commands in section 4 if an error occurs.
1.2 How to update the installer manually
Use this alternative if you prefer to download the ZIP on your computer and copy the files with a file-transfer tool. You, your hosting provider or your server administrator need access to the installation files.
- Back up the current installation. Keep a copy of the application files and a separate database backup before replacing files. The updater’s dated backup covers application files; it is not a database export.
- Download the package. Save FlinkISO-Updater.zip and extract it on your computer.
- Find the installation root. This is the directory containing
appandlib. If your site opens under a subdirectory such as/flinkiso/, use that installation’s root directory. - Copy the files into that installation. Merge the extracted
appfolder with the existingappfolder. Allow the three included files to be overwritten. Do not delete or replace the entire existing application folder, and do not create an extraapp/appdirectory. - Check the server requirements. The PHP runtime serving FlinkISO needs cURL and an enabled
exec()function. The server needs the command-lineunzipexecutable. PHP ZipArchive is not required by this package. - Open the application updater. Sign in with an authorised administrator account and open Billing → Update. Refresh the page after replacing the files, then follow section 2 below.
Files included in the package
app/Controller/BillingController.php
app/Lib/FlinkisoUpdater.php
app/View/Billing/update.ctp
Copy all three files from the same package. It does not include app/Config/core.php, database credentials or customer uploads. Keep those installation-specific files as they are.
2. How to use updates from the application
Schedule the update when other users have signed out. Keep your database backup separately and ensure the server has enough free disk space for the application backup, download and installation workspace.
- Click on icon. Use the intended installation and an authorised administrator account.
- Select Back up and update. The updater checks the configured GitHub source and prepares a dated application backup.
- Choose what to do if today’s backup exists. You can create another backup in a time-named subfolder or reuse a completed backup from today. An incomplete backup cannot be reused.
- Keep the page open. Animated indicators and progress bars show connection, backup, download, extraction, file checks, SQL processing and installation. Avoid starting another update in a second tab.
- Wait for the completion message. The updater downloads the configured archive, extracts the files, processes SQL and publishes the application files. SQL statement errors are logged and skipped so processing can continue.
- Review and test. Check the completion result, sign in again if needed, and test important pages. Review any installation or recovery errors before retrying. If the page provides guidance about
ApiPathorPDFTkPath, ask your administrator to review those settings separately; the updater preservescore.php.
Where updates come from
Without a customer repository override, the updater uses Techmentis/FlinkISO-QMS-Updates. A customer installation can instead use its configured private GitHub repository. Its URL, archive folder and personal access token (PAT) are supplied in core.php. All three override values must be complete. Never post the PAT in a support message or screenshot.
Backup and log locations
| Location, relative to the installation root | Purpose |
|---|---|
backup/YYYY-MM-DD/ | Dated application-file backup. Another backup on the same day uses a time-named subfolder. |
backup/.updater/<run-id>/ | Run log, staging and file-recovery information. The leading dot makes this folder hidden in some file browsers. |
app/webroot/updates/ | Downloaded archive and extracted update workspace. Previous update downloads are cleaned during a new run. |
Existing configuration, uploaded files and installed PO/MO translation catalogs are preserved by the current updater. SQL processing is not a database rollback: a database change may remain applied even when a later file operation fails.
3. Who can update the application?
| Person or account | What they can do |
|---|---|
| Signed-in application administrator | Can Update when the account’s administrator flag is enabled. |
| Super User without administrator access | The Super User role alone does not grant permission to run application updates. |
| Regular application user | Cannot run the updater. Ask an application administrator. |
| Server administrator / hosting provider | Can copy the initial updater package, configure PHP and unzip, correct file ownership and permissions, and assist with backups and recovery. Server access does not replace the application login requirement. |
The application’s web-server account must be able to read the files being backed up and write to the backup folder, updates workspace and application paths being replaced. The account used for an SSH or file-transfer session may have different permissions.
4. Errors, warnings and notices
Use the exact message and affected path to identify the next action. Keep the run log when asking for support. Remove tokens and credentials from anything you share.
| Message or symptom | What it means and how to resolve it |
|---|---|
| PHP cURL and ZipArchive extensions are required | An older updater is still executing. Download the current ZIP and replace all three package files in the correct installation. If it persists, ask the server administrator to check PHP’s opcode cache. Installing PHP ZipArchive is not necessary for the current package. |
| Missing required PHP extension: cURL (php-curl) | cURL is missing from the PHP runtime serving this website. Ask the hosting provider to enable it for that runtime. A command-line PHP installation can use different extensions from Apache or PHP-FPM. |
| PHP exec() is required to run command-line unzip | The server disables the PHP function used to launch unzip. Ask the hosting provider whether it can be enabled for the application. Repeatedly replacing the ZIP will not change a server restriction. |
| Command-line unzip is required | The server’s unzip executable is absent or unavailable to the web-server account. Ask the administrator to install or expose it. This message refers to the server utility, not PHP ZipArchive. |
| No write permission, Cannot read/traverse, or Cannot create directory | The web-server account cannot access the reported path. Ask the administrator to check ownership, write access and directory traversal access, including parent folders. Giving access only to backup does not fix application files that cannot be replaced. Avoid blanket 0777 permissions. |
| Permission denied when accessing a backup over SSH | Updater-created backup folders can be private to the web-server account. An authorised server administrator can access them with appropriate privileges or grant the support account suitable group or ACL access. Do not change every application file’s permissions to open a backup. |
| Incomplete paid repository configuration | One or more of URL, folder and PAT is missing or empty. Complete the customer configuration, or remove the incomplete override to use the default repository. If using getenv(), pass the environment-variable name; the server must actually define that variable. |
| GitHub returned HTTP 401, 403 or 404 | Check the repository URL, branch, token access, expiry and any organisation restrictions. A private repository can return 404 when access is missing. A 403 can also indicate a rate limit; review the download details before changing credentials. |
| GitHub returned HTTP 504 | A gateway or archive service timed out. Wait and retry after checking server connectivity. A 504 by itself does not establish that the PAT is wrong. |
| GitHub transfer failed or an empty archive | Check outbound connectivity, DNS, TLS certificates, proxy settings and free disk space from the application server. Correct the reported cause before retrying. |
| Could not unzip the update archive, archive-folder error, or no application update files | Read the unzip details in the message. Check free space and the workspace permissions, then verify that the configured branch/archive contains an app directory under the expected repository folder. Retry the download if it is incomplete. |
| Today’s backup already exists or no completed backup to reuse | Choose whether to create another backup. Reuse is possible only when a completed backup exists. Reload the page if the backup choice has expired or the date changed. |
| Could not check the backup or Invalid updater token | Reload the page and confirm that you are still signed in as an administrator. If the problem remains, check the failed request and application log for a server error or an incorrect installation URL. |
| Another update is running | Allow the active update to finish. Ask an administrator to inspect the running process if it appears stuck. Do not delete lock files or start competing updates while a run is active. |
| SQL statement errors in the log | The current updater logs SQL errors, skips the failed statement and continues. Duplicate columns, tables or rows can occur when a query was applied before. Other SQL errors may mean a required change was not installed; ask the database administrator to review the log. Detailed SQL warnings are not normally shown as blocking alerts. |
| Copy failed, Cannot publish, or File rollback attempted | A file could not be copied or replaced. Check both paths in the error, ownership, available space and temporary-file conflicts. File rollback may have been attempted, but SQL may already have committed. Review the recovery log and database state before retrying or restoring. |
| A previous installation was interrupted… needs-review | This message can come from an older updater. Preserve the backup and recovery log, check the previous run’s state, and confirm the current three files were installed. Do not remove a marker without reviewing what happened. |
| Symbolic link is not allowed or ZIP symbolic-link rejection | These are messages from older restrictive updater code. Replace all three updater files with the current package. If the same text remains, verify the installation path and PHP opcode cache. |
| Update completed successfully | The updater cycle finished. Keep the backup and test the application. Since SQL errors are skipped, review the run log if a required feature or database table is still missing. |
Ubuntu / Debian commands for common server problems
Check PHP cURL and exec()
These commands check command-line PHP. Apache or PHP-FPM can use another PHP version or configuration, so compare the result with the version serving FlinkISO.
php -v
php --ini
php -r 'echo "cURL: ", extension_loaded("curl") ? "enabled" : "missing", PHP_EOL; echo "exec(): ", function_exists("exec") ? "enabled" : "disabled", PHP_EOL;'
If the website uses the distribution’s default PHP packages, install cURL with:
sudo apt install php-curl
If the application uses a specific PHP version, install the matching package instead. For example, for a website running PHP 8.2:
sudo apt install php8.2-curl
Use the appropriate package for the PHP version already serving the site; do not install another PHP version just to run the updater. See the official PHP package-installation guide. If exec() is disabled, ask the administrator to review disable_functions in the website’s PHP configuration and any hosting restrictions.
Restart only the PHP service used by the website, when needed
For Apache with its PHP module:
sudo systemctl restart apache2
For PHP-FPM, restart the actual FPM service instead. This example is for PHP 8.2; change the version to match your site:
sudo systemctl restart php8.2-fpm
You do not need to run both commands. A service restart briefly interrupts requests, so use the same maintenance window as the update.
Allow the web-server account to write update files
Use this when the updater reports write or traversal errors and the installation is intended to update its own application files. These ACL commands retain existing owners while giving the named web-server account access to app and backup. Change both settings to match your installation. They do not grant access to every user.
(
set -eu
FLINKISO_ROOT="/var/www/html/flinkiso"
FLINKISO_WEB_USER="www-data"
sudo apt install acl
sudo mkdir -p "$FLINKISO_ROOT/backup" "$FLINKISO_ROOT/app/webroot/updates"
sudo setfacl -R -m "u:$FLINKISO_WEB_USER:rwX" \
"$FLINKISO_ROOT/app" "$FLINKISO_ROOT/backup"
sudo setfacl -m "u:$FLINKISO_WEB_USER:rx" "$FLINKISO_ROOT"
sudo -u "$FLINKISO_WEB_USER" test -w "$FLINKISO_ROOT/backup"
sudo -u "$FLINKISO_WEB_USER" test -w "$FLINKISO_ROOT/app/webroot/updates"
sudo -u "$FLINKISO_WEB_USER" test -w "$FLINKISO_ROOT/app/Lib"
echo "Backup, updates and library directories are writable."
)
If a parent directory still prevents access, inspect the complete path with namei -l /var/www/html/flinkiso/app/Lib/FlinkisoUpdater.php and have the administrator correct that parent’s traversal permissions. On hosting that does not support ACLs, use its supported ownership/group-permission method. Do not apply chmod -R 0777 to the installation.
Find updater logs and access a private backup
Replace the example installation path. These are read-only diagnostic commands; they do not remove backups, locks or recovery files.
sudo ls -la /var/www/html/flinkiso/backup
sudo find /var/www/html/flinkiso/backup/.updater -maxdepth 2 -type f -name 'run.jsonl' -print
After locating the correct run log, view it with sudo less /full/path/to/the/log. Keep it when asking for support, with credentials redacted. If you need to restore the updater files, use the backup you made before replacing them. Restoring those files does not reverse database changes from a later application update.
Before asking for support
- Record the installation URL, approximate run time and the exact error.
- Keep the dated backup and the matching
backup/.updater/run folder. - Say whether the failure happened during backup, download, SQL processing or file installation.
- Share relevant log entries with the authorised support team, with PATs and credentials removed.