MANHOUR PLANNING · 10 NOVEMBER 2026
GoDaddy cPanel setup & current-server transfer
One hosted MySQL database. Everyone uses the same HTTPS address.
1. Prepare the hosting
- In GoDaddy open your Web Hosting account, then cPanel Admin.
- Use MySQL Database Wizard (or the database management page) to create a dedicated database and user. Add the user to that database with ALL PRIVILEGES. Copy the complete names, including the cPanel account prefix.
- Select PHP 8.2 or newer with PDO MySQL / pdo_mysql enabled. The program targets MySQL 5.7+/8.x or compatible MariaDB with InnoDB. The packaged tests used PHP 8.4 and MariaDB 11.8.
- Enable an SSL certificate for your domain. Use HTTPS for installation and the application. The setup form and production API require HTTPS.
- Decide the address, for example
https://your-domain.com/manhour/. This app can coexist with your existing site in its own folder. No office port number is needed.
2. Upload the two folders
Use cPanel File Manager. Enable “Show Hidden Files” so .htaccess and .user.ini are copied.
| Folder in this ZIP | Destination on GoDaddy |
|---|---|
| public_html/manhour | /home/CPANEL_USER/public_html/manhour |
| manhour-private | /home/CPANEL_USER/manhour-private — outside public_html |
Replace CPANEL_USER with your actual account name. The private folder holds PHP services, credentials and backups. Do not place backup files, SQLite databases, source code or transfer tools in public_html.
If a subdomain uses a different document root, edit public_html/manhour/config-path.php to return the absolute path of your private folder. The default assumes the layout above. Keep files owned by your cPanel account; do not use 777 permissions.
3. Install an empty database
- Inside manhour-private, rename
setup-key.example.phptosetup-key.php. Replace the quoted placeholder with a unique random secret of at least 32 characters. Keep it private. - Open
https://your-domain.com/manhour/install.php. Enter the setup key, exact app URL, database host (usually localhost), full database name, full username and database password. - Choose separate management and team editing codes, each 16–72 characters. An optional separate view-only code is supported. The app retains the central version's shared-code model: the entered name labels changes; it is not a separate per-person account.
- Click Install empty database. The installer creates the MySQL tables and writes protected
manhour-private/config.php. It does not load old seed data. - Delete the public
install.phpand privatesetup-key.phpafter success. Sign in using the management code. Before import, the app shows a notice and blocks input saves.
If setup reports that the schema was installed but configuration could not be renamed, rename config.pending.php to config.php inside the private folder. Do not run a reset or delete tables to fix a path/permission error.
4. Export the CURRENT office server
Recommended: full transfer including change history.
- Use the office computer running the existing central app. Confirm it is running the latest November release with Expected project teams. If older, first update its program files while keeping its existing database, start it once, then continue.
- Copy
transfer_tools/Export_Current_Server.cmdandtransfer_tools/export_current_server.pybeside that server'sserver.pyandserver-settings.json. - Ask everyone to save and stop entering data. Stop the office server window with Ctrl+C. Retain a copy of its complete folder as the rollback backup.
- Double-click
Export_Current_Server.cmd. It reads the data_dir specified in server-settings.json and exports the realmanhour.sqlite3without changing it. It refuses folders without the current server settings/database. - Locate the new
Manhour_Server_Transfer_YYYYMMDD_HHMMSS.jsonfile in the office app folder. Note the project, employee, deleted-row and audit counts printed by the utility.
Alternative command, if Python is already on the office computer:
python export_current_server.py --app-folder "C:\Path\To\CurrentManhourApp"
Alternative: active data only. In the running central app, sign in as management and choose Download backup. Export after everyone has saved, then stop the old server. This JSON preserves current project/employee inputs, Field settings, working days, rates, order, check marks, hide cutoffs and row metadata. The old app's ordinary download does not contain the full audit/deleted-row archive; use the recommended utility when that history is required.
The server backup does not include local browser preferences or old access codes. Choose a preferred team in each browser after moving, and use the new hosting access codes.
5. Import and verify
- In the hosted app, sign in as management and click Import / restore JSON.
- Select the export from the current office server. Review the replacement confirmation. Import replaces the hosted dataset; it does not merge separate copies. A protected backup of the hosted data is made first.
- Check the imported project/employee/team counts and source backup time shown above the app.
- Before staff edit anything, choose Download backup in the hosted app. Save that JSON on the office computer.
- Run the included comparison tool against the source and hosted downloads:
python verify_transfer.py "C:\Exports\Manhour_Server_Transfer.json" "C:\Exports\Manhour_Hosted_Backup.json"
It verifies matching configuration, record IDs, project/employee details, team assignments, every weekly value, revisions, saved timestamps/names, deleted records when included, and source audit history when included. New hosting import events are allowed. It prints TRANSFER VERIFIED on a match. Resolve any mismatch before opening the hosted app for editing.
Imported values are preserved; the PHP importer does not rerun dated team transfers or change old project/work-type allocations. Requirements, FTE, capacity, balance and graphs use the same frontend calculations as the latest central app.
6. Enable automatic backups
- In cPanel open Advanced → Cron Jobs.
- Select twice per hour, or use minute
*/30and*for the other four fields. - Use the command below, with your real cPanel username. Select the PHP 8.2+ CLI path appropriate to your hosting if the default PHP differs.
/usr/local/bin/php -q /home/CPANEL_USER/manhour-private/backup.php
For example, cPanel installations may provide /usr/local/bin/ea-php82 for PHP 8.2; confirm the available version with your hosting settings. Set a cron notification email so failures are visible. Once the job runs, the app's backup warning clears. A warning returns if no successful backup has run for more than two hours.
Backups are full JSON snapshots under manhour-private/backups. Retention: 96 scheduled snapshots, 30 daily copies, 30 manual copies and 30 pre-import copies. The initial installation backup is kept. These files include sensitive planning data and must remain outside the public web folder. Check your hosting disk quota and download periodic copies to another location. Hosting backup services are additional protection, not a replacement for this job.
To restore: sign in as management, download the current hosted backup first, then use Import / restore JSON with the chosen protected backup. Other users' old drafts are rejected after restoration and must be refreshed.
7. Daily use and future updates
- Everyone opens the same HTTPS address. Saved changes refresh in other users' reports automatically. Conflicting edits to the same row are rejected; changes to different rows are retained.
- The current and previous week and future weeks remain editable; older weekly values remain locked, matching the central app.
- All recent corrections are retained: expected projects, signed Balance FTE, unique employee count per team/week, aligned Actions, transparent arrows and logos in outputs/Excel.
- Management can download backups, import data, maintain Field lists and view change history. Team editors can edit inputs and team responsible-person lists/drawing rates. View-only users cannot save changes.
- For code updates, back up first. Replace program files and built assets; keep config.php, backups and the MySQL database. Do not reinstall an existing database. Refresh browsers with Ctrl+F5.
- To change an access code, use
set_access_code.phpfrom a cPanel terminal, as described below. It also signs out current sessions for that role.
/usr/local/bin/php /home/CPANEL_USER/manhour-private/set_access_code.php editor
The utility asks for the new code via standard input so it does not appear in the command line/history. Input may be echoed by your terminal. Valid roles are admin, editor and viewer. If your hosting has no terminal, ask your hosting administrator to run the command.
8. Troubleshooting & validation
| Symptom | Check |
|---|---|
| Setup incomplete / private source not found | The private folder location and config-path.php must agree. |
| MySQL setup fails | Full prefixed database/user names, password, hostname, assigned privileges and pdo_mysql. |
| Old week cannot be changed | This is the preserved weekly-lock rule. Do not alter the server clock to bypass it. |
| Import asks for newer office version | Update the current central program, keeping its database, start it once, and export again. |
| Import too large / request rejected | Default JSON limit is 64 MB. PHP post_max_size is set to 70M and memory_limit to 256M in .user.ini; your host may override these. Review effective settings before a large history transfer. |
| Backup warning | Cron command/PHP path, private-folder permissions, disk quota and cPanel error log. |
| Save cannot be confirmed | Keep the draft open and retry the same save. Retry identifiers prevent duplicate application. |
| Slow updates with many users | Check the hosting plan's concurrent PHP processes, CPU/memory and MySQL limits. Load testing on your actual plan is still required. |
See VALIDATION.txt for executed tests and limits. The package has not been installed on your GoDaddy account and your live office database has not been accessed here. The transfer tools must be run against that database during setup.