ctahosting

App-backend · BaaS

Backend til din app: klar til brug fra første dag

Lad være med at bygge din apps backend fra bunden. Brugerkonti, Postgres-database, automatisk API, fillagring og realtidsdata er klar i ét projekt. Du kan koncentrere dig om skærmene og dit produkt.

  • Postgres med automatisk REST API
  • Oprettelse, login og row level security (RLS)
  • Fast månedspris, ingen forbrugsafregning
Se pakkerneHvad er med?

Fra 9,21 kr. om måneden + moms

Færdige moduler

Alt det backend, din mobilapp har brug for, i ét projekt

Med hver ny app skriver man de samme ting igen: oprettelse, login, database, API, upload af filer. Her er det hele klar. Din app forbinder med projekt-ID og nøgle, og så kører den.

  • Authentication

    Oprettelse og login med e-mail og adgangskode, engangskode på sms, log ind med Google og Apple. Sessioner og refresh-tokens klaret for dig.

  • Database

    En dedikeret Postgres-database til hvert projekt. Opret tabeller, relationer, indekser og views i kontrolpanelet eller med SQL.

  • API

    Automatisk REST API til din database: så snart du opretter en tabel, er endpoints til at læse, skrive, filtrere og paginere klar.

  • Lagring

    Upload af billeder, video og filer. Adgangsregler pr. bucket og upload i bidder til store filer.

  • Realtime

    Live-opdateringer: en ændring i en tabel når appen med det samme. Til chat, aktivitetsfeeds og live-dashboards.

  • Edge Functions

    Kør din egen backend-kode: webhooks, afsendelse af e-mails, kald til tredjeparts-API’er og egne forretningsregler.

  • Sikkerhed (RLS)

    Dataadgang pr. bruger: med row level security ser hver bruger kun de rækker, de har lov til at se.

  • Backup og overvågning

    Ugentlig backup af databasen, gendannelse samt logs over forespørgsler og fejl. Vedligeholdelse og opdatering af serverne klarer vi.

Pakker

Pakker til dit app-backend

Alle pakker har alle moduler: Authentication, database, API, lagring, realtime, Edge Functions og RLS. Pakkerne adskiller sig kun på ressourcer.

  • Starter

    Til din første app eller MVP

    33 % rabat19,78 kr.

    13,16 kr./md. + moms

    157,94 kr. forudbetalt for 12 mdr.

    Fornyelse: 13,16 kr./md.

    • 1 GB SQL-plads (Postgres)
    • 1 SQL-database(r) (projekter)
    • 1 GB fillagring
    • 5.000 månedlige aktive brugere
    • 100 samtidige realtime-forbindelser
    • 250.000 edge function-kald om måneden
    • Ugentlig backup
    • Gratis udgivelse i app-butikkerne
    • Alle moduler inkluderet
  • Mest valgt

    Pro

    Til apps i vækst

    29 % rabat46,23 kr.

    33,01 kr./md. + moms

    396,06 kr. forudbetalt for 12 mdr.

    Fornyelse: 33,01 kr./md.

    • 3 GB SQL-plads (Postgres)
    • 3 SQL-database(r) (projekter)
    • 5 GB fillagring
    • 25.000 månedlige aktive brugere
    • 500 samtidige realtime-forbindelser
    • 1.000.000 edge function-kald om måneden
    • Ugentlig backup
    • Gratis .app-domæne (1. år)
    • Gratis udgivelse i app-butikkerne
    • Alle moduler inkluderet
  • Business

    Til meget trafik og flere apps

    30 % rabat66,08 kr.

    46,23 kr./md. + moms

    554,80 kr. forudbetalt for 12 mdr.

    Fornyelse: 46,23 kr./md.

    • 5 GB SQL-plads (Postgres)
    • 5 SQL-database(r) (projekter)
    • 10 GB fillagring
    • 100.000 månedlige aktive brugere
    • 2.000 samtidige realtime-forbindelser
    • 5.000.000 edge function-kald om måneden
    • Ugentlig backup
    • Gratis .app-domæne (1. år)
    • Gratis udgivelse i app-butikkerne
    • Alle moduler inkluderet

Priserne er pr. måned ekskl. moms. Jo længere periode, jo større rabat. Du kan skifte pakke når som helst.

Authentication

Færdigt login-system: oprettelse, login og brugerkonti

Login-skærmen er det første, brugeren møder i din app. En fejl eller et sikkerhedshul her rammer hele produktet. Brugerstyringen kommer med færdige endpoints til din app.

  • Oprettelse med e-mail og adgangskode, bekræftelse af e-mail og nulstilling af adgangskode
  • Login uden adgangskode med engangskode på sms
  • Log ind med Google og Log ind med Apple
  • Access- og refresh-tokens (JWT), sessioner pr. enhed, log ud på afstand
  • Brugerprofiler, roller og egne felter
  • Begrænsning af loginforsøg mod brute force-angreb
  • Sletning af konto og eksport af persondata direkte i appen (GDPR)

Database · API · RLS

Postgres-database med automatisk API

Dine data ligger i en rigtig relationel database: Postgres. API’et er klar, så snart tabellen er oprettet, og med RLS-regler bestemmer du, hvem der må læse og skrive hvilke rækker.

  • Dedikeret Postgres: tabeller, relationer, indekser, views og SQL-funktioner
  • Automatisk REST API fra dine tabeller: filtrering, sortering, paginering og relaterede data
  • Row level security (RLS): regler som “brugeren ser kun sine egne poster”
  • Realtime: modtag ændringer i tabellerne i appen, mens de sker
  • Egne endpoints, webhooks og planlagte jobs med Edge Functions
  • Tabeleditor og SQL-editor i kontrolpanelet
  • Ugentlig backup og gendannelse med ét klik

Sådan virker det

Din apps backend klar i tre trin

  1. 1

    Opret dit projekt

    Vælg en pakke. Du får dit eget projekt-ID, database og API-nøgler.

  2. 2

    Opret dine tabeller

    Opret tabeller i kontrolpanelet eller med SQL, og skriv dine RLS-regler. API-endpoints dukker selv op.

  3. 3

    Forbind din app

    Din Flutter-, React Native-, Swift- eller Kotlin-app forbinder med projekt-ID og nøgle. Brugerne opretter sig, og data begynder at flyde.

Sammenligning

Byg dit eget backend, eller brug et færdigt?

Typiske backend-opgaver i en mobilapp, løst på begge måder.

OpgaveBygge dit eget backendctahosting app-backend
Oprettelse, login, nulstil adgangskodeUgers udvikling og sikkerhedstest Klar
Log ind med Google og AppleEn separat integration til hver udbyder Klar
API til databasenSkrive endpoints tabel for tabel Automatisk
Dataadgang pr. brugerManuelle tjek i hvert endpoint RLS-regel
Upload af filerSætte lagring og rettigheder op separat Klar
Live-dataDrive din egen WebSocket-server Realtime
Servere, backup, opdateringerDit ansvar Det klarer vi
Pris og afregningBetaling efter forbrug Fast månedspris

Til hvem

Til alle apps med brugerkonti og data

  • Indhold og læring

    Kursus-, video-, podcast- og artikelapps med brugerens fremskridt og favoritter.

  • Sport og sundhed

    Trænings-, kost- og tracking-apps med personlige data for hver bruger.

  • Booking og service

    Apps til saloner, klinikker og rådgivere med kundekonto og kalender.

  • Chat og fællesskab

    Besked-, kommentar- og feed-apps, opdateret live med realtime.

  • Mobil SaaS

    Team-, forretnings- og produktivitetsapps med rollebaseret adgang.

  • Bureauer

    Teams, der bygger apps til kunder, med et separat miljø pr. projekt.

Kodeeksempler

Sådan ser det ud i din editor

Vælg dit sprog, og bladr gennem eksemplerne. Alle moduler kører over almindelige HTTP-endpoints, og et SDK er ikke nødvendigt. API-adressen er den samme for alle projekter (https://alex.ctahosting.com); PROJECT_ID og ANON_KEY finder du for dit projekt i kontrolpanelet. Kommentarerne i koden er på engelsk.

auth.phpPHP
<?php// Project ID and key: in the dashboard under "Overview"$apiUrl    = 'https://alex.ctahosting.com'; // the same address for every project$projectId = getenv('PROJECT_ID');    // e.g. prj_8fK2mQ… (sent as the x-project header)$anonKey   = getenv('ANON_KEY');    // public key (not a secret) // Shared request helper: sends JSON, returns JSONfunction request(string $method, string $url, array $body = [], ?string $token = null): array{    global $anonKey, $projectId;    $ch = curl_init($url);    curl_setopt_array($ch, [        CURLOPT_CUSTOMREQUEST  => $method,        CURLOPT_RETURNTRANSFER => true,        CURLOPT_HTTPHEADER     => array_filter([            'apikey: ' . $anonKey,            'x-project: ' . $projectId,            'Content-Type: application/json',            $token ? 'Authorization: Bearer ' . $token : null,        ]),        CURLOPT_POSTFIELDS     => $body ? json_encode($body) : null,    ]);    $response = json_decode(curl_exec($ch), true);    curl_close($ch);    return $response ?? [];} // 1) Sign up: the verification email is sent automaticallyrequest('POST', "$apiUrl/auth/v1/signup", [    'email'    => 'jane@example.com',    'password' => 'Strong-Pass-123',]); // 2) Log in: returns an access token (access_token)$session = request('POST', "$apiUrl/auth/v1/token?grant_type=password", [    'email'    => 'jane@example.com',    'password' => 'Strong-Pass-123',]);$token = $session['access_token']; // send as Bearer on later requests

01 Oprettelse og login (Authentication)

Opret dig og log ind med e-mail og adgangskode. Det access-token, du får tilbage, bruges i alle efterfølgende forespørgsler. Log ind med Google og Apple bruger samme endpoint.

products.phpPHP
<?php// Uses request() and $token from auth.phprequire __DIR__ . '/auth.php'; // 1) Read: the latest 20 products in Istanbul, newest first//    select   → columns to return//    city=eq. → equals filter (gt, lt, like, in … also work)//    order    → sorting, limit → page size$products = request('GET', "$apiUrl/rest/v1/products"    . '?select=id,name,price,city'    . '&city=eq.Istanbul'    . '&order=created_at.desc&limit=20', [], $token); foreach ($products as $u) {    echo $u['name'] . ' — ' . $u['price'] . " USD\n";} // 2) Write: POST to the same endpoint; inserted if RLS allows itrequest('POST', "$apiUrl/rest/v1/products", [    'name'  => 'Coffee mug',    'price' => 12,    'city'  => 'Istanbul',], $token);

02 Læs og skriv data (automatisk REST API)

Endpointet findes, så snart tabellen er oprettet: filtrering, sortering og paginering via URL-parametre. RLS-reglerne bestemmer, hvilke rækker der kommer tilbage.

orders_policy.sqlSQL · ens i alle sprog
-- -------------------------------------------------------------- Row-level security (RLS): the policy is written once, in the database.-- Every API request is filtered by it, whatever language it comes from.-- ------------------------------------------------------------ -- 1) Enable RLS on the orders table (once enabled, nobody sees anything by default)alter table orders enable row level security; -- 2) Read: users only see their own orders--    auth.uid() = the ID of the user making the request (from the token)create policy "own orders" on orders  for select using (user_id = auth.uid()); -- 3) Insert: users can only add orders for themselvescreate policy "insert own" on orders  for insert with check (user_id = auth.uid()); -- 4) Update: only their own order, and only while it's 'pending'create policy "update while pending" on orders  for update using (user_id = auth.uid() and status = 'pending');

03 Adgang pr. bruger (RLS)

Reglen skrives én gang i databasen og gælder for hver forespørgsel, uanset hvilket sprog den kommer fra. Derfor er eksemplet den samme SQL i alle sprog.

broadcast.phpPHP
<?php// PHP usually doesn't listen, it BROADCASTS: when an order status changes,// every app listening on that channel gets a message instantly.require __DIR__ . '/auth.php'; // Broadcasts use the service_role key: SECRET, keep it on the server only (never in the app)$serviceKey = getenv('SERVICE_ROLE_KEY');$orderId = 1042; // Channel: "order-1042" → everyone who has this order's screen openrequest('POST', "$apiUrl/realtime/v1/api/broadcast", [    'messages' => [[        'topic'   => "order-$orderId",        'event'   => 'status',        'payload' => ['status' => 'shipped', 'carrier' => 'DHL'],    ]],], $serviceKey); // Note: writing to the table works too. Every INSERT reaches apps// listening on the messages table on its own (see the other languages).

04 Live-opdateringer (Realtime)

Appen lytter på en tabel, og en ny række dukker op på skærmen, så snart den bliver indsat. Fra serveren (PHP) kan du også sende en besked til alle, der lytter.

upload.phpPHP
<?phprequire __DIR__ . '/auth.php'; // File from the form (input name="avatar")$file = $_FILES['avatar']['tmp_name'];$userId = 'u_8f2c'; // Path: <bucket>/<file name>  → avatars/u_8f2c.jpg$ch = curl_init("$apiUrl/storage/v1/object/avatars/$userId.jpg");curl_setopt_array($ch, [    CURLOPT_POST           => true,    CURLOPT_RETURNTRANSFER => true,    CURLOPT_HTTPHEADER     => [        'apikey: ' . $anonKey,        'x-project: ' . $projectId,        'Authorization: Bearer ' . $token,        'Content-Type: image/jpeg',        'x-upsert: true',            // overwrite if it exists    ],    CURLOPT_POSTFIELDS     => file_get_contents($file),]);curl_exec($ch);curl_close($ch); // Direct link in a public bucket:echo "$apiUrl/storage/v1/object/public/$projectId/avatars/$userId.jpg";

05 Upload af billeder og filer (lagring)

Profilbilleder, dokumenter og video. Bucket-regler bestemmer, hvem der må uploade og se hvad. Filer i offentlige buckets har et direkte link.

welcome.phpPHP
<?php// The function runs in your project; PHP only calls it.// (You write the function itself in the dashboard under "Edge Functions".)require __DIR__ . '/auth.php'; // POST /functions/v1/<function name>$result = request('POST', "$apiUrl/functions/v1/welcome", [    'email' => 'jane@example.com',    'name'  => 'Jane',], $token); // JSON returned by the functionif (!empty($result['ok'])) {    echo 'Welcome email sent';}

06 Din egen backend-kode (Edge Functions)

Funktioner til alt det, API’et ikke dækker. Her kaldes en funktion, der sender en velkomstmail til den nye bruger. Webhooks, tredjeparts-API’er og planlagte jobs virker på samme måde.

FAQ

Ofte stillede spørgsmål om app-backend

Finder du ikke svaret, så skriv til os; vi svarer samme dag.

Hvad passer til dig?

Lad vores salgsteam foreslå en pakke ud fra dine behov.

  • Det er serverdelen bag skærmene i din app: den gemmer brugerkonti, tjekker login, opbevarer data og leverer dem til appen via et API. Appen kører på telefonen; det her arbejde foregår på serveren. Det kaldes også backend-service, app-server eller MBaaS (Mobile Backend as a Service).

Fokuser på din app, og lad os klare backend

Login, database, API, lagring og realtime er klar. Vælg din pakke, og kontakt vores salgsteam, hvis du har spørgsmål.

Intet oprettelsesgebyr · Ingen binding · 14 dages returret