---
titel_en: Deploy an app with a database (App plan)
titel_nl: Een app met database deployen (App-bundel)
categorie: deploy
bundels: app
geverifieerd_op: 2026-09-13
bewijs: app/deploy/page.tsx, lib/app-deploy.ts, .github/actions/dorelli-deploy/action.yml
zoekwoorden: app, database, postgres, container, github action, DATABASE_URL, dockerfile
---
## en
Logins, orders, a dashboard with data: then your project is a Node or Next app, not a static site. It runs with us in its own container with its own Postgres database (€ 15 a month after a 14-day trial). The image is built on GitHub, never on our server, so this always goes through a workflow in your repository:

```yaml
name: Deploy app to Dorelli
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: elsaviour/dorelli-cli/.github/actions/dorelli-deploy@v1
        with:
          plan: app
          email: you@example.com
          site-id: ${{ secrets.DORELLI_SITE_ID }}
          deploy-token: ${{ secrets.DORELLI_DEPLOY_TOKEN }}
          registry-user: ${{ secrets.DORELLI_REGISTRY_USER }}
          registry-password: ${{ secrets.DORELLI_REGISTRY_PASSWORD }}
```

The first run creates the site and a registry token and tells you which four secrets to set. Your app gets `DATABASE_URL` and `PORT` (default 3000) as environment variables. No Dockerfile needed: we then use `npm ci`, `npm run build`, `npm start`. Have your own Dockerfile? It is used as is.

The app scales to zero without traffic; the first visit after a quiet period takes 10 to 30 seconds, see [Cold starts](/docs/apps/cold-start). Logs, restart and environment variables are in your portal, see [Logs, restart and variables](/docs/apps/portal).

## nl
Inloggen, bestellingen, een dashboard met data: dan is je project een Node- of Next-app en geen statische site. Die draait bij ons in een eigen container met een eigen Postgres-database (€ 15 per maand na 14 dagen proef). Het image wordt op GitHub gebouwd, nooit op onze server, dus dit loopt altijd via een workflow in je repository:

```yaml
name: Deploy app naar Dorelli
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: elsaviour/dorelli-cli/.github/actions/dorelli-deploy@v1
        with:
          plan: app
          email: jij@voorbeeld.nl
          site-id: ${{ secrets.DORELLI_SITE_ID }}
          deploy-token: ${{ secrets.DORELLI_DEPLOY_TOKEN }}
          registry-user: ${{ secrets.DORELLI_REGISTRY_USER }}
          registry-password: ${{ secrets.DORELLI_REGISTRY_PASSWORD }}
```

De eerste run maakt de site en een registry-token aan en zegt welke vier secrets je zet. Je app krijgt `DATABASE_URL` en `PORT` (standaard 3000) als omgevingsvariabelen. Geen Dockerfile nodig: wij gebruiken dan `npm ci`, `npm run build`, `npm start`. Eigen Dockerfile? Die wordt gewoon gebruikt.

De app schaalt naar nul bij geen bezoek; het eerste bezoek na een stille periode duurt 10 tot 30 seconden, zie [Koude starts](/docs/apps/cold-start). Logs, herstart en omgevingsvariabelen staan in je portaal, zie [Logs, herstart en variabelen](/docs/apps/portal).
