KyPanelDocs

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

TypeForServes
LaravelComposer, Vite build, migrations, queues and schedulerpublic/ through PHP-FPM
PHPAny PHP project with a public folderThe public folder through PHP-FPM
Node.jsNext.js, Nuxt, Express…Your process, listening on 127.0.0.1:$PORT
PythonDjango, Flask, FastAPI with gunicorn or uvicornYour process, listening on 127.0.0.1:$PORT
StaticHTML or a built site (Vite, Astro…)The output folder

Create an app

  1. 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).
  2. Branch and domain: a domain or subdomain of the account. It keeps its current site until the first deploy is live.
  3. Versions: PHP, Node.js (for builds and Node apps) or Python.
  4. 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()
MacroDoes
$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_RELEASEThe new release's folder and id
KY_CURRENT_PATH, KY_APP_PATHcurrent and the app folder
KY_COMMIT, KY_COMMIT_SHA, KY_BRANCH, KY_REPOSITORYWhat's being deployed
KY_DEPLOY_AUTHOR, KY_DEPLOY_MESSAGE, KY_DEPLOY_TRIGGER, KY_DEPLOYMENT_IDWho and why
KY_DOMAIN, KY_USER, KY_APP_NAME, KY_APP_TYPE
KY_PHP, KY_PHP_FPM, KY_COMPOSERThe app's PHP binary, its FPM service, Composer
KY_PORTNode.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.