Paradigm

MANHOUR PLANNING · 10 NOVEMBER 2026

GoDaddy cPanel setup & current-server transfer

One hosted MySQL database. Everyone uses the same HTTPS address.

Use the data saved on your current central server. The new app starts empty. This ZIP contains no original/sample project or employee data. Import the server export before entering new information.

1. Prepare the hosting

  1. In GoDaddy open your Web Hosting account, then cPanel Admin.
  2. 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.
  3. 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.
  4. Enable an SSL certificate for your domain. Use HTTPS for installation and the application. The setup form and production API require HTTPS.
  5. 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 ZIPDestination 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

  1. Inside manhour-private, rename setup-key.example.php to setup-key.php. Replace the quoted placeholder with a unique random secret of at least 32 characters. Keep it private.
  2. 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.
  3. 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.
  4. Click Install empty database. The installer creates the MySQL tables and writes protected manhour-private/config.php. It does not load old seed data.
  5. Delete the public install.php and private setup-key.php after 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.

  1. 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.
  2. Copy transfer_tools/Export_Current_Server.cmd and transfer_tools/export_current_server.py beside that server's server.py and server-settings.json.
  3. 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.
  4. Double-click Export_Current_Server.cmd. It reads the data_dir specified in server-settings.json and exports the real manhour.sqlite3 without changing it. It refuses folders without the current server settings/database.
  5. Locate the new Manhour_Server_Transfer_YYYYMMDD_HHMMSS.json file 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

  1. In the hosted app, sign in as management and click Import / restore JSON.
  2. 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.
  3. Check the imported project/employee/team counts and source backup time shown above the app.
  4. Before staff edit anything, choose Download backup in the hosted app. Save that JSON on the office computer.
  5. 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.

Cutover: after verification, share the new HTTPS address and use only the hosted app. Keep the old office server stopped. There is no two-way synchronization between the two databases. If you import a new source backup later, it replaces hosted edits.

6. Enable automatic backups

  1. In cPanel open Advanced → Cron Jobs.
  2. Select twice per hour, or use minute */30 and * for the other four fields.
  3. 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

/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

SymptomCheck
Setup incomplete / private source not foundThe private folder location and config-path.php must agree.
MySQL setup failsFull prefixed database/user names, password, hostname, assigned privileges and pdo_mysql.
Old week cannot be changedThis is the preserved weekly-lock rule. Do not alter the server clock to bypass it.
Import asks for newer office versionUpdate the current central program, keeping its database, start it once, and export again.
Import too large / request rejectedDefault 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 warningCron command/PHP path, private-folder permissions, disk quota and cPanel error log.
Save cannot be confirmedKeep the draft open and retry the same save. Retry identifiers prevent duplicate application.
Slow updates with many usersCheck 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.

Official hosting references