Q-Putaway – Installation and deployment (Hostinger shared hosting)
This guide installs Q-Putaway on Hostinger shared hosting (Premium/Business/Cloud plans). The same steps work on any Apache/LiteSpeed host with PHP and MySQL.
1. Requirements
| Item | Requirement |
|---|---|
| PHP | 7.4 or newer (8.1–8.3 recommended). Tested with PHP 8.3; the code is statically checked against PHP 7.4–8.4 |
| PHP extensions | Required: pdo_mysql, mbstring, json, openssl, session, ctype, fileinfo. Recommended: zip (Excel export, update packages, upload archives), sodium (signed updates), gd, curl |
| Database | MySQL 5.7+/8.x or MariaDB 10.3+ (InnoDB, utf8mb4) |
| Web server | Apache or LiteSpeed with .htaccess + mod_rewrite (Hostinger default) |
| HTTPS | Required in production (camera scanning, secure cookies, PWA install) |
| Cron | Recommended (scheduled reports, expiry alerts, forecasts, cleanup, auto backup) |
Check these in hPanel → Advanced → PHP Configuration (choose the PHP version and tick the extensions) before installing. The installer re-checks them.
2. Upload the files
Q-Putaway has no public/ folder. The project root is the web root.
- hPanel → Files → File Manager → open
public_html(or create a sub-folder such aspublic_html/wms). - Upload the release ZIP and Extract it there. The folder must then contain
index.php,.htaccess,assets/,app/,config/,storage/and so on. - Make sure the hidden
.htaccessfiles were uploaded. They block web access toapp/,config/,storage/,database/,tests/,cron/,tools/andviews/. Every one of these folders also contains its ownRequire all denied.htaccess. - Permissions: folders
755, files644.config/and everything understorage/must be writable by PHP (on Hostinger they are by default).
Nginx (VPS only):.htaccessis ignored. Route all non-file requests toindex.php?r=$uri, and deny^/(app|config|storage|database|tests|cron|tools|views)/plus dotfiles.
3. Create the database
hPanel → Databases → MySQL Databases: create a database and a user with all privileges on it. Note the names (Hostinger prefixes them, e.g. u123456789_wms). The host is localhost.
4. Enable SSL
hPanel → Security → SSL → install the free SSL certificate. Use the https:// address from now on.
5. Run the web installer
Open https://your-domain/ (or /wms/). You are redirected to /install:
- System check: all required items must be green.
- Database: host
localhost, port3306, name, user and password → Test connection & continue. The option "create database if it does not exist" works only if your account has that privilege. Existing databases are never dropped or overwritten. - Company: name, address, registration/tax IDs, currency, timezone, date format, fiscal year, contact email and the Application URL (
https://…). Keep Clean URLs ticked. Tick Force HTTPS once SSL works. - Super Admin: name, email (sign-in ID) and password (≥ 10 characters with letters and digits).
- Install: creates the schema, roles and permissions, reference data (units, reason codes, numbering, label templates) and Help Center articles. It then writes
config/config.php(database credentials, the application encryption key, a separate backup encryption key and the cron token) and createsstorage/installed.lock.
After installation /install returns 404.
Partial installation: if the installer stops (timeout, wrong password), open the site again. Re-running is safe: tables are created with IF NOT EXISTS, migrations already applied are skipped, seeding only adds missing rows, and existing users are kept.
6. Set up cron
hPanel → Advanced → Cron Jobs → Custom:
*/5 * * * * /usr/bin/php /home/<USER>/domains/<DOMAIN>/public_html/cron/cron.php >/dev/null 2>&1
Adjust the path to where you uploaded Q-Putaway (Administration → Email & Schedules shows the exact command for your install). Cron runs scheduled reports, expiry/low-stock alerts (daily), forecast refresh (nightly), cleanup of expired tokens/temporary files, and the optional daily backup. A lock prevents overlapping runs.
If your plan has no cron, an external scheduler can call https://your-domain/jobs/run?token=<cron token from config/config.php> (at most once a minute). Keep the token secret. Without any cron, scheduled reports and alerts do not run; Q-Putaway never relies on page visits to run jobs.
7. First login checklist
Sign in as the Super Admin. The dashboard checklist guides you through:
- Warehouses (system locations are created automatically).
- Locations/bins (bulk generator in Masters → Locations).
- Products, barcodes and packaging (or CSV import).
- Suppliers and customers.
- Barcode and label settings.
- Opening stock (CSV import Opening stock, or a goods receipt of type Opening).
- Users, roles and warehouse assignments.
- Email (SMTP) and a test email.
- First backup, plus retention and the daily backup setting.
- Cron.
8. Hardening checklist
- [ ] HTTPS works, and Force HTTPS is on (in Settings or
config/config.php→app.force_https). - [ ]
https://your-domain/config/config.phpreturns 403 (also test/storage/installed.lockand/app/bootstrap.php). - [ ]
config/config.phphas'debug' => false. - [ ] 2FA is enabled for Super Admins (Profile → Two-factor authentication). Optionally require it for admins in Settings → Security.
- [ ] A backup was created and downloaded. Store a copy off-server, and store the backup key (
backup.keyinconfig/config.php) separately from the backups. - [ ] Run the HTTP security smoke test from a computer with PHP:
php tests/http/smoke.php https://your-domain admin@email 'password'.
9. Local development
php -S 127.0.0.1:8080 tools/dev-router.php # mimics the .htaccess rules
QP_TEST_DB_PORT=3306 php tests/run.php # unit/integration/security tests (uses a *_test database)
QP_TEST_DB_PORT=3306 php tests/concurrency/race.php
10. Moving or restoring an installation
Copy all files (including config/config.php and storage/uploads) and restore the latest backup through Administration → Backups (see docs/backup-restore.md). If the domain changes, update app.url in config/config.php.