Installing Postwoo on your own hosting
Postwoo installs like WordPress or any other PHP web app: put the files on your hosting, open the address in a browser and answer a few questions. It takes about ten minutes.
Before you start
You need:
- PHP 8.3 or newer with the usual extensions (the wizard checks them and tells you how to switch them on).
- A database: MySQL/MariaDB (recommended) or SQLite (no setup, fine for a small agency). On cPanel create one under MySQL® Databases: a database, a user, then Add User To Database with ALL PRIVILEGES. Names start with your account name, e.g.
acct_postwoo. - A domain or subdomain for Postwoo, e.g.
social.your-agency.com, with HTTPS (cPanel → SSL/TLS Status → Run AutoSSL). Postwoo runs at the root of a domain, not in a sub-folder.
1. Upload the files
Upload everything (FTP, SFTP or cPanel File Manager → Upload, then Extract) into a folder of its own, for example postwoo/ in your home folder. Keep the hidden .htaccess files (File Manager → Settings → Show Hidden Files).
2. Point the domain at public/
Only the public/ folder should be reachable from the web. In cPanel open Domains (or Subdomains), choose your domain → Manage and set the document root to postwoo/public.
Can't change the document root (for example you uploaded straight into public_html)? Postwoo ships a .htaccess in its main folder that sends every request into public/ and refuses .env, storage/, src/, config/ and the other internals. The wizard shows an amber note in that case; setting the document root is still the safer choice.
3. Open the site and enter the setup code
Open https://your-domain/. You are sent to the installer. Because anyone could open a freshly uploaded site, the installer first asks for a setup code: open storage/setup-code.txt in File Manager (or download it over FTP) and type the code. Codes last 24 hours; a new one is written to the same file after that. Too many wrong codes pause the form for 15 minutes.
4. Follow the wizard
- Requirements — green is ready, amber works with a caveat, red must be fixed. Each item has a How to fix with the cPanel menu (Select PHP Version, MultiPHP INI Editor) and the Ubuntu command.
- Site — the address (filled in from your browser), the name shown in e-mails and the browser tab, and the default time zone.
- Database — choose MySQL or SQLite. Press Test connection: if it fails the message says why (wrong password, missing user prefix, database not created, wrong host — on shared hosting the host is usually
localhost). - Admin — your agency name, your name, e-mail and a password of at least 12 characters. Tick Add a demo workspace to get a separate, clearly labelled sample agency to explore.
- Optional services — e-mail (SMTP, with a Send test e-mail button), the Woo AI assistant (an Anthropic API key) and S3 media storage. Skip any of them and add them to
.envlater; the page says what each one is for. - Install — Postwoo writes
.env, creates the encryption key and the database tables (in small batches, so hosts that stop scripts after 30 seconds are fine — keep the page open) and your account. - Done — see below.
5. Back up your APP_KEY
The last page shows your APP_KEY once. Postwoo encrypts every connected social account with it. Copy it into your password manager. Without it (for example if .env is lost) every client has to reconnect every account. It is also stored in .env as APP_KEY=….
6. Add the two cron jobs
Scheduled posts, retries, review syncs and reports run in the background. In cPanel open Advanced → Cron Jobs, choose Once Per Minute and add the two commands shown on the last page of the wizard, for example:
/usr/local/bin/php /home/acct/postwoo/bin/postwoo schedule:run
/usr/local/bin/php /home/acct/postwoo/bin/postwoo queue:work --queue=publishing,sync,default --max-seconds=55
The queue worker runs for up to 55 seconds and exits, so each minute's run takes over from the last. A nightly backup line is shown too (recommended). On a VPS you can run the worker as a systemd service instead; the page shows how.
From now on every /install address answers 404: the installer cannot be used to reconfigure a live site.
Updating Postwoo
- Upload the new files over the old ones (keep
.envandstorage/). - Sign in as the admin. If the update changes the database you see "Database update needed (N migrations)".
- Press Update database. A backup is written to
storage/backupsfirst, then the update runs in small steps. Settings → System shows the version and the last backup.
Deploying from GitHub over FTP? The workflow shows a short "Back in a minute" page while it uploads and updates the database. If the site ever stays on that page, delete the hidden file .maintenance in the Postwoo folder.
Installing from the command line
With SSH you can use the same installer in a terminal:
php install.php # asks the same questions
php install.php --db=mysql --app-url=https://social.your-agency.com --db-password=… \
--admin-email=you@agency.com --admin-password=… --org="Your Agency" --yes
php install.php --upgrade # after uploading a new version: backup + update + restart the worker
sudo php install.php --systemd --web-user=www-data also installs the worker service and the cron jobs on a Linux server.
Troubleshooting
| You see | Do this |
|---|---|
| "Fix the web root first" | Your project files can be downloaded from the web. Set the document root to public/ (step 2) or make sure the .htaccess from the upload is in the Postwoo folder and your host allows .htaccess (mod_rewrite). |
| "That code does not match" | Open storage/setup-code.txt again — a new code is written after 24 hours. Letters and digits only; dashes and case don't matter. |
| "Your setup session expired" | The page was open a long time or cookies are blocked for the site. Press Start again; finished steps are kept. |
| MySQL "refused the user name or password" | On cPanel use the full prefixed user name and add the user to the database with ALL PRIVILEGES. |
| The install stops half-way | Press Try again: it continues where it stopped. |
| Pages show "Back in a minute" for a long time | Delete .maintenance in the Postwoo folder. |
| Images do not reach Instagram/TikTok | Platforms fetch media by URL: use HTTPS, or set up S3 storage. |