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-VERSION

Configure

cp .env.example .env
php artisan key:generate

Set at least:

  • APP_NAME, APP_URL

  • CMS_SITE=default — starter pages ship under content/sites/default/ (rename or add your own site folder later)

  • CMS_PATH=content/sites

  • COAPTIVE_LICENSE_FEATURES=cms (pure CMS SKU — do not enable GME features here)

  • Database: leave DB_CONNECTION=sqlite for the default CMS setup (touch database/database.sqlite if needed; the web installer can also create it), or configure PostgreSQL/MySQL via DB_*

  • Mail: MAIL_*, or configure Tools → Email after login

  • Optional: GOOGLE_MAPS_API_KEY when 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.sh

Adjust 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.

  1. Review the requirements checklist (PHP, extensions, writable paths, database connectivity).

  2. Create the first administrator (name, email, password).

  3. The installer runs migrate without seed data and writes storage/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 when APP_URL starts with https://

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

  1. Open https://mysite.example.com/ → redirects to /install

  2. Confirm all required checks pass (especially bcmath)

  3. Create the admin account

  4. 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

StepDone when
Packagesbcmath loaded in PHP-FPM
FilesSite under /var/www/mysite, CMS_SITE=mysite folder exists
EnvAPP_URL + APP_KEY set, sqlite file exists
DBphp artisan migrate --force succeeded
Webnginx serves public/, FPM answers PHP
DNSHostname reaches this nginx
LicenseValid for this hostname
InstallAdmin created at /install

Common failures

SymptomFix
“Missing — enable ext-bcmath”Install php8.5-bcmath, reload FPM
no such table: sessionsRun migrations
Skips /installRemove storage/app/install.lock
Redirects to http / broken loginTrust proxies + force HTTPS
License errorsHosts/HMAC must match Ops-issued license