Leap Academy · Customer deployment
Self-hosted Docker installation
Install Ideas-to-Action on your own infrastructure using pre-built Docker images. You do not need application source code or Git access — only the deployment package, registry credentials, and a license key from Leap Academy.
What you received
| Item | Description |
|---|---|
| Deployment files | docker-compose.yml, nginx.conf, .env.example |
| Docker images | Pre-built Ideas-to-Action API (ideas-to-action-api) and Web (ideas-to-action-web) images from a private registry |
| Registry credentials | Username / password (or token) to pull images |
| License key | Organization subscription key from Leap Academy |
APP_KEY | Laravel encryption key (from support if not included) |
The Compose stack runs Nginx, Next.js, Laravel API, MySQL, Redis, a queue worker, and a scheduler.
1. Server requirements
| Requirement | Minimum |
|---|---|
| OS | Linux (Ubuntu 22.04+ or equivalent) |
| Docker | 24+ with Compose v2 (docker compose) |
| CPU / RAM | 2 vCPU, 4 GB RAM (8 GB recommended) |
| Disk | 20 GB free (grows with DB + uploads) |
| Outbound HTTPS | Required for license activation and validation |
2. DNS
Point your portal hostname at the server (or load balancer) that will run Docker. Use the same hostname everywhere in .env.
| Record | Example | Points to |
|---|---|---|
A | portal.yourcompany.com | Public IP of your server |
CNAME | portal.yourcompany.com | Load balancer hostname |
3. HTTPS (TLS)
The bundled Nginx container listens on port 80. Terminate TLS in front of Docker:
- Cloudflare, AWS ALB, Azure App Gateway, or host Nginx / Caddy
- Forward
https://portal.yourcompany.com→http://<server-ip>:80 - Preserve
Host,X-Forwarded-For,X-Forwarded-Proto
After TLS works, all URLs in .env should use https://.
4. Configure .env
cp .env.example .envEdit .env before starting the stack.
Required
| Variable | Notes |
|---|---|
APP_KEY | base64:... from Leap Academy if blank |
APP_URL / NEXT_PUBLIC_SITE_URL | Public site URL, e.g. https://portal.yourcompany.com |
LICENSE_DOMAIN | Hostname only (no scheme) |
LICENSE_INSTALL_URL | https://portal.yourcompany.com/setup |
DB_PASSWORD / DB_ROOT_PASSWORD | Strong MySQL passwords |
REDIS_PASSWORD | Required — container will not start without it |
API_IMAGE / WEB_IMAGE | ideas-to-action-api and ideas-to-action-web tags from Leap Academy |
ORGANIZATION_LICENSE_SERVER_URL | Leap Academy cloud control plane (not your instance) |
ORGANIZATION_LICENSE_HMAC_SECRET | Shared secret with cloud — openssl rand -hex 32 |
Fill every blank secret in .env.example before starting. Enterprise administrators are created in the /setup wizard — not via Docker env vars.
Customer instance mode (leave as shipped)
APP_INSTANCE_MODE=customer
LICENSE_REQUIRE_ACTIVATION=true
ORGANIZATION_LICENSE_USE_LOCAL=false
NEXT_PUBLIC_API_URL=/apiRecommended — mail
Set MAIL_HOST, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD, MAIL_FROM_ADDRESS, and MAIL_FROM_NAME for password resets and notifications.
5. Install
On the server, in the folder that contains docker-compose.yml:
docker login registry.ideastoaction.com
docker compose pull
docker compose up -d
docker compose ps
curl -s https://portal.yourcompany.com/api/v1/healthAllow 1–2 minutes for MySQL and the API to become healthy before opening the setup wizard.
6. First-time setup wizard
Open /setup on your domain (for example https://portal.yourcompany.com/setup).
| Step | What you do |
|---|---|
| Welcome | Confirm you are on the correct domain |
| Requirements | Auto-checks PHP, DB, Redis, permissions |
| Database | Confirms MySQL connectivity |
| License | Enter the license key from Leap Academy |
| Administrator | Create the first Enterprise admin |
| Install | Activates the instance and binds your domain |
| Completed | Redirect to Enterprise login |
Setup can only be completed once per installation. Keep the admin credentials secure.
7. First login
| Portal | URL |
|---|---|
| Enterprise | /enterprise |
| Setup (first install only) | /setup |
Branding (logo, colors, company name) is configured in Enterprise settings after login — not baked into the Docker images.
8. Updates
When Leap Academy publishes a new version:
# Update API_IMAGE / WEB_IMAGE in .env if instructed
docker compose pull
docker compose up -dMySQL volumes and uploaded files are preserved across updates.
9. Optional — external database or Redis
By default Compose starts bundled MySQL and Redis. To use managed services instead:
- Set
DB_HOST,DB_PORT,DB_DATABASE,DB_USERNAME,DB_PASSWORDto your database - Set
REDIS_HOST,REDIS_PORT,REDIS_PASSWORDto your Redis - Remove or comment out the
mysql/redisservices indocker-compose.ymlif you do not need them locally
Queue workers and the scheduler stay in Compose — they reuse the backend image and your .env.
10. Troubleshooting
| Symptom | Check |
|---|---|
502 on /api | Backend still booting — wait, then docker compose restart nginx. If it persists, check docker compose logs backend for missing secrets in .env. |
| License invalid | Key typo, wrong domain, or cloud cannot reach instance |
| Site loads, API fails | APP_URL / LICENSE_DOMAIN mismatch |
| Mail not sending | Fill MAIL_*, then recreate containers |
| View logs | docker compose logs -f backend |
11. Support
When contacting Leap Academy, include your domain, APP_VERSION from .env, and the output of docker compose ps.
- Documentation: docs.ideastoaction.com
- Support: support.ideastoaction.com
- Vendor: leapacademy.com
