Customer panel
Apps
Deploy Laravel, PHP, Node.js, Python and static sites from Git with no downtime.
Software › Apps deploys a Git repository to a domain. Push to your branch and the site updates: each deploy builds a new release next to the live one and switches over only when it's ready, so visitors never see a half-built site. A failed deploy leaves the live release untouched.
App types
| Type | For | Serves |
|---|---|---|
| Laravel | Composer, Vite build, migrations, queues and scheduler | public/ through PHP-FPM |
| PHP | Any PHP project with a public folder | The public folder through PHP-FPM |
| Node.js | Next.js, Nuxt, Express… | Your process, listening on 127.0.0.1:$PORT |
| Python | Django, Flask, FastAPI with gunicorn or uvicorn | Your process, listening on 127.0.0.1:$PORT |
| Static | HTML or a built site (Vite, Astro…) | The output folder |
Create an app
- Source: a GitHub repository (connect GitHub once under Apps › GitHub accounts; your provider enables it) or any Git URL over SSH (the panel gives you a deploy key to add to the repository, read-only).
- Branch and domain: a domain or subdomain of the account. It keeps its current site until the first deploy is live.
- Versions: PHP, Node.js (for builds and Node apps) or Python.
- Optionally create a database for the app: its credentials go into the app's
.env.
Layout
~/apps/NAME/
releases/20261017031405/ one folder per deploy (the last ones are kept)
current -> releases/… the live release; the domain serves it
shared/ kept between releases: .env, storage/, uploads…Shared paths (one per line, e.g. storage, .env, public/uploads) are linked into every release.
Deploy script
Each app has a deploy script you can edit. The Laravel default:
$CREATE_RELEASE()
cd $KY_RELEASE_DIRECTORY
composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
if [ -f package.json ]; then
npm ci || npm install
npm run build
fi
php artisan storage:link
php artisan migrate --force
php artisan optimize
$ACTIVATE_RELEASE()
$RESTART_QUEUES()| Macro | Does |
|---|---|
$CREATE_RELEASE() | Clones the commit into a new release folder and links the shared paths. |
$ACTIVATE_RELEASE() | Switches current to the new release and reloads PHP / restarts the app process. |
$RESTART_QUEUES() | Restarts the queue workers so they run the new code. |
Variables available to the script:
| Variable | |
|---|---|
KY_RELEASE_DIRECTORY, KY_RELEASE | The new release's folder and id |
KY_CURRENT_PATH, KY_APP_PATH | current and the app folder |
KY_COMMIT, KY_COMMIT_SHA, KY_BRANCH, KY_REPOSITORY | What's being deployed |
KY_DEPLOY_AUTHOR, KY_DEPLOY_MESSAGE, KY_DEPLOY_TRIGGER, KY_DEPLOYMENT_ID | Who and why |
KY_DOMAIN, KY_USER, KY_APP_NAME, KY_APP_TYPE | |
KY_PHP, KY_PHP_FPM, KY_COMPOSER | The app's PHP binary, its FPM service, Composer |
KY_PORT | Node.js/Python: the port your process must listen on |
php, node, npm and python in the script are the app's versions. The script runs as your user, with a time limit (settings). A health check path (e.g. /up) is requested after activation.
Deploying
- Deploy now in the app's page.
- Push to deploy: with GitHub, pushes to the branch deploy automatically. With another Git host, add the app's webhook URL and secret (in the app's settings) to the repository's webhooks.
- Deploy hook URL: a secret URL that starts a deploy when requested, for CI pipelines:
curl -X POST https://SERVER:7711/hooks/deploy/TOKEN.
Each deploy has a live log. Cancel a deploy that's running; roll back to any kept release in one click.
Environment
Environment edits shared/.env (Laravel and PHP) or the variables the process gets (Node.js, Python). Every save keeps a version you can look back at. The web process and workers read the environment when they start: saving can restart the app's processes so they pick it up; otherwise the next deploy does.
Composer credentials: paste an auth.json for private package repositories (Nova, Spark, Filament…); it's used during deploys only.
Processes
Long-running commands, restarted if they stop: queue workers (php artisan queue:work), Horizon, the scheduler, or any daemon. Set how many run side by side and how long a stopping process may finish its work. Each process has its log.
The scheduler (Laravel) runs php artisan schedule:run every minute when turned on.
Redis
Turn on Redis gives the account its own Redis-compatible instance (Valkey) with a password and a memory size. The app's .env gets the connection. When it's full, writes fail instead of evicting your queued jobs.
Logs and commands
Logs & commands shows the app's logs (Laravel's storage/logs, or the process output) and runs one-off commands in the live release as your user, up to 5 minutes each, for example php artisan cache:clear.