Install
Set up the standalone Coaptive CMS host from a versioned release archive.
You receive a versioned install archive such as coaptive-cms-1.0.6.tar.gz, a SHA256SUMS file, and a separately signed license from Code 44. Coaptive packages are not on public Packagist. Opening Content → Pages after install creates the locked Legal and Privacy pages (/legal and /legal/privacy). Products is a component like Services (Site Settings toggle, Components & Extras tab, public /products). The archive already includes Composer vendor/ (with a mirrored code44/coaptive-cms package) and built frontend assets.
Requirements. PHP 8.4+ (with SQLite if using the default DB), a web server (nginx recommended), and writable storage/ and bootstrap/cache/.
Laravel, Composer, and Node. Coaptive CMS is a Laravel application, but you do not install Laravel separately — the release archive already includes Composer vendor/ (Laravel + the mirrored code44/coaptive-cms package) and built frontend assets. Composer and Node are optional after unpack; use them only if you rebuild PHP dependencies or frontend assets yourself.
Unpack and verify
sha256sum -c SHA256SUMS
tar -xzf coaptive-cms-VERSION.tar.gz
cd coaptive-cms-VERSIONConfigure
cp .env.example .env
php artisan key:generateSet at least:
APP_NAME,APP_URLCMS_SITE=default— starter pages ship undercontent/sites/default/(rename or add your own site folder later)CMS_PATH=content/sitesCOAPTIVE_LICENSE_FEATURES=cms(pure CMS SKU — do not enable GME features here)Database: leave
DB_CONNECTION=sqlitefor the default CMS setup (touch database/database.sqliteif needed; the web installer can also create it), or configure PostgreSQL/MySQL viaDB_*Mail:
MAIL_*, or configure Tools → Email after loginOptional:
GOOGLE_MAPS_API_KEYwhen Page Builder map sections use Google Maps (restrict by HTTP referrer in Google Cloud Console)Optional:
AWS_*or Azure storage env vars when using Tools → Backup / Export scheduled off-site backups (see Updates & backups)
Leave COAPTIVE_LICENSE_HMAC empty on the client unless Code 44 instructs otherwise. Place the signed license at the path in COAPTIVE_LICENSE_FILE (default storage/app/coaptive.license.json).
Web server and permissions
Point the document root at public/. Prefer HTTPS and secure session cookies in production. Then:
php artisan storage:link
bash deploy/harden-permissions.shAdjust ownership to your PHP-FPM user if needed. Full client runbook: deploy/INSTALL.md inside the archive.
First-run installer
Open the site in a browser. Until setup is complete, every request redirects to /install.
Review the requirements checklist (PHP, extensions, writable paths, database connectivity).
Create the first administrator (name, email, password).
The installer runs
migratewithout seed data and writesstorage/app/install.lock.
There is no default admin user in a blank release. Do not run php artisan migrate --seed on production — that seeder is for local/dev only.
After install
Sign in to the Control Panel (/cp). Use the Site setup checklist for Branding, Site Theme, Site Settings, and pages.
Preserve storage/app/install.lock across upgrades. Annual licensing and updates are described on the Pricing page. Email support covers product questions — not ongoing content editing or hosting. See also How you receive the software.
Install a blank Coaptive CMS site (Ubuntu)
This is a practical Ubuntu runbook for a blank CMS host. Laravel is already in the tarball — do not install Laravel, Composer, or Node as part of this process unless you intend to rebuild dependencies or assets.
What you need
Ubuntu server with nginx + PHP 8.5 (FPM) + SQLite
A domain/subdomain pointing at this server (DNS A/AAAA, or a tunnel to port 80)
The CMS release tarball (e.g.
coaptive-cms-0.8.6.tar.gz)A signed license for your hostname (from Coaptive Ops), or the HMAC secret if you issue licenses yourself
1. Install packages
sudo apt update
sudo apt install -y nginx php8.5-fpm php8.5-cli php8.5-sqlite3 php8.5-bcmath php8.5-mbstring php8.5-xml php8.5-curl php8.5-zip
php8.5-bcmath is required — the install wizard will fail without it.
2. Unpack the site
Pick a short site id (slug), e.g. mysite, and hostname mysite.example.com.
sudo mkdir -p /var/www/mysite
sudo tar -xzf coaptive-cms-0.8.6.tar.gz -C /tmp
sudo rsync -a /tmp/coaptive-cms-0.8.6/ /var/www/mysite/
sudo cp -a /var/www/mysite/content/sites/default /var/www/mysite/content/sites/mysite
# Rewrite frontmatter so pages match CMS_SITE (do not leave site: default)
sudo find /var/www/mysite/content/sites/mysite -type f \( -name '*.md' -o -name '*.json' \) -print0 \
| sudo xargs -0 sed -i \
-e 's/^site: default$/site: mysite/' \
-e 's/"site": "default"/"site": "mysite"/'
sudo rm -f /var/www/mysite/storage/app/install.lock
Remove install.lock so the first-run wizard runs. After copying default → {slug}, rewrite site: default to site: {slug} in that site’s content (markdown frontmatter and JSON). Leaving site: default makes settings such as “Show Sign in in the footer” read the wrong site.json.
3. Configure .env
sudo cp /var/www/mysite/.env.example /var/www/mysite/.env
sudo nano /var/www/mysite/.env
Set at least:
APP_NAME="My Site"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://mysite.example.com
CMS_SITE=mysite
DB_CONNECTION=sqlite
COAPTIVE_LICENSE_FEATURES=cms
COAPTIVE_LICENSE_FILE=storage/app/coaptive.license.json
COAPTIVE_LICENSE_HMAC=your-ops-hmac-secret
SESSION_SECURE_COOKIE=true
Then:
sudo chown -R www-data:www-data /var/www/mysite
# Or use a dedicated app user (e.g. coaptive) if that’s your pattern
sudo -u www-data bash -lc 'cd /var/www/mysite && php artisan key:generate --force'
sudo -u www-data bash -lc 'cd /var/www/mysite && touch database/database.sqlite'
sudo -u www-data bash -lc 'cd /var/www/mysite && php artisan migrate --force'
Run migrations before opening the site in a browser.
4. Behind a reverse proxy / Cloudflare / tunnel
If TLS terminates in front of nginx, add:
In
bootstrap/app.php: trust proxies (trustProxies(at: '*'))In
AppServiceProvider::boot(): force HTTPS whenAPP_URLstarts withhttps://
Without this, login/install redirects and cookies can break.
5. PHP-FPM + nginx
Create a PHP-FPM pool (or use the default pool) pointing at /var/www/mysite.
Minimal nginx server (adjust if you terminate TLS on the box):
server {
listen 80;
server_name mysite.example.com;
root /var/www/mysite/public;
index index.php;
client_max_body_size 12M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.5-fpm.sock; # or your pool socket
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
location ~ /\.(?!well-known).* { deny all; }
}
sudo nginx -t && sudo systemctl reload nginx php8.5-fpm
6. DNS
Point mysite.example.com at this server (A/AAAA), or add the hostname on your tunnel/proxy to the same nginx port.
7. License
Place a valid signed license at:
/var/www/mysite/storage/app/coaptive.license.json
Hosts in the license must include mysite.example.com. Feature list should include at least cms.
8. Finish in the browser
Open
https://mysite.example.com/→ redirects to/installConfirm all required checks pass (especially bcmath)
Create the admin account
Log in to Control Panel
The wizard uses .env for the database — it does not create Postgres roles. SQLite needs no extra DB setup.
Quick checklist
| Step | Done when |
|---|---|
| Packages | bcmath loaded in PHP-FPM |
| Files | Site under /var/www/mysite, CMS_SITE=mysite folder exists |
| Env | APP_URL + APP_KEY set, sqlite file exists |
| DB | php artisan migrate --force succeeded |
| Web | nginx serves public/, FPM answers PHP |
| DNS | Hostname reaches this nginx |
| License | Valid for this hostname |
| Install | Admin created at /install |
Common failures
| Symptom | Fix |
|---|---|
| “Missing — enable ext-bcmath” | Install php8.5-bcmath, reload FPM |
no such table: sessions | Run migrations |
Skips /install | Remove storage/app/install.lock |
| Redirects to http / broken login | Trust proxies + force HTTPS |
| License errors | Hosts/HMAC must match Ops-issued license |