The Hosting guide

Set up Dbrij Hosting step by step: what you need, what to press, and how you know each step worked.

Set up Hosting, step by step

By the end, your website or app is live at its own address with HTTPS, on your own domain, with email beside it.

Before you start, have these ready

  • Your website or app: a GitHub repository, a folder of built files or a zip from your developer. No code at all? Start from a template.
  • Optional: a domain for the site. The Domains guide covers buying one.
  1. Create a project

    Open Projects in Hosting and press New project. A project holds everything one website or app needs: the site itself, a database, background jobs.
    Open Hosting
    You will know it worked when you are inside the new project, which has no services yet.
  2. Add your site as a service

    Press New service, give it a name, then pick where it comes from.

    I have the files: A built folder or a zip from your developer.

    1. Choose Upload build

      Pick Upload build and drop in the folder or the zip. Dbrij serves it exactly as it is.

    My code is on GitHub: A repository you can open.

    1. Choose GitHub repo

      Pick GitHub repo, connect your GitHub account when asked, and choose the repository and branch. Dbrij works out how to build it.

    Start from a template: A ready made app in one click.

    1. Choose Template

      Pick Template, choose one from the gallery, such as a blog or an automation tool, and press Deploy template.
  3. Watch it go live

    Dbrij builds and ships it while the logs stream on screen. The first time takes a few minutes.
    You will know it worked when the service shows a live address with a padlock; open it and your site loads.
  4. Put it on your own domain

    Bought your domain on Dbrij? Open Domains in the Hosting menu and press Attach on it. The records are written for you.

    Domain from somewhere else? Open the service, go to its Domains tab, type the domain (for example www.yourcompany.com) and press Add domain. Dbrij shows the one record to create where your domain is managed.

    You will know it worked when your domain opens the site with a padlock, usually within an hour.
  5. Add email on the same domain

    Your website and your email can share one domain. The task below walks through it, and your site keeps working throughout.
    Add email to your domain
  6. Keep an eye on it

    Logs sits at the top of the Hosting menu for when something looks wrong, and Usage shows what the month is costing as it happens.
    Open Usage
  7. Let an AI assistant help

    Add Dbrij to the AI chat app or coding tool you already use, and it can deploy, read a failed build and roll back for you. It signs in as you, and anything that costs money waits for your approval.
    Connect an AI assistant
    You will know it worked when your assistant answers when you ask it to list your Hosting projects.

Add email to a domain your website already uses

Your developer set up the site. Now you want name@yourcompany.com on the same domain. Your website keeps working the whole time.

  1. Open Email in the Hosting menu

    Under Infrastructure, open Email. A domain bought on Dbrij is listed with Enable email: press it and skip to the last step. For a domain from somewhere else, press Add outside domain and type it.
    Open Email
  2. Add the records it shows

    The domain page lists a few records and the steps to add them where your domain is managed. The email records sit beside your website's records and do not touch them.

    If your developer looks after the domain, press Copy instructions for whoever manages your domain and send them the message.

    The DNS step, slowly
  3. Wait for Active

    There is nothing to press. The page switches the domain on by itself, usually within an hour, and we email you when it is live.
    You will know it worked when the domain shows Active on the Email page.
  4. Create an address for each person

    Open Addresses in the Hosting menu, type the part before the @, choose who holds it and press Add address.
    Open Addresses
    You will know it worked when the address is listed and its holder can send from it.

Questions people ask

Do I need to know how to code?

My deploy failed. What now?

Will adding email break my website?

How much will it cost?

The Email page says it needs a company.

How each part works

What Hosting is

Hosting runs your apps and APIs on Dbrij. You point it at a Git repository, a prebuilt image or a template, and it builds, deploys and serves the result at a live URL with automatic HTTPS. There is no Dockerfile to write unless you want one, no server to rent, and no certificate to renew.

Everything is organised into projects, and a project groups the services you deploy together: a web app, the API behind it, and the database beside them. Managed PostgreSQL and Redis spin up in one click, custom domains attach to any service, and live metrics show what every service consumes so the bill never surprises you.

Deploying from a repo or an image

A service starts from one of a few sources, and the choice only changes how the deploy begins:

  • A Git repository. Connect GitHub once, or point the service at a repository on Dbrij Source. Dbrij builds it for you, and once push to deploy is connected, every push to your branch ships a fresh deploy on its own. There is nothing to register and no webhook to fail.
  • A prebuilt image. If you already build images elsewhere, the service pulls and runs yours directly.
  • A template. The gallery launches ready made open source tools in one click: a whiteboard, workflow automation, a blog, uptime monitoring, dashboards and a spreadsheet database.
  • A function. Function services carry their code with them and expose a Code tab right on the service page.

Services and deployments

A service page carries everything about one running unit, as tabs: Overview, Insights, Security, Deployments, Logs, Variables, Domains, Recovery and Settings. The parts you will live in:

  • Deployments lists every deploy with what triggered it and its build or rollout logs.
  • Logs tails the running service, and on the Reserved plan keeps 90 days of history you can search by day. Logs also sit at the top level of the rail, beside Projects, because the moment anyone wants them is an incident.
  • Variables holds the environment configuration the service starts with.
  • Settings covers memory, CPU and the rest. Renaming a project only changes the display name; deployed services, URLs and databases stay exactly as they are.

Deleting a service stops it serving traffic immediately, and it cannot be undone.

Log history: what happened on a past day

The Logs tab opens on the live output of the running service. On the Reserved plan it also keeps that output: every line each service writes, from every copy it runs, is collected every half minute and kept for 90 days. A restart, a redeploy or a crash no longer takes the lines with it; when a container restarts, the last output of the run that ended is kept too, so a crash can be read afterwards.

  • Switch the Logs tab to History and choose a day. Only days with logs are offered.
  • Narrow it with a start and end time, a search, and Errors only or Warnings and errors. A search ignores case; wrap it in slashes, like /timeout|refused/, to search by a regular expression.
  • The bars show the day hour by hour, with errors in red. Click an hour to narrow the results to it.
  • Results come a thousand lines at a time; Load more continues. Download day saves the whole day as a text file.

Days and times are Lagos time. If a service writes more than 2 GB of compressed output in a day, history stops keeping its lines until midnight and a note in the history says so. On other plans the live view is the only view, and the History switch explains how to turn it on.

Databases

Managed PostgreSQL and Redis are one click away and run as services inside the same project, wired and ready for the apps beside them. A database service has its own tabs: Overview, Data, Deployments, Logs, Security and Settings.

The Data tab lets you look at what is inside without leaving the page, and Security holds the access side. Because the database lives next to the app that uses it, connection details stay inside the project rather than travelling through chat messages.

Custom domains

Every service gets a working URL on deploy, and the Domains tab is where you replace it with your own. Point a domain you own at the service and Dbrij issues and renews the certificate for you; a short "securing your link" wait while the certificate is issued is the only step between pointing the domain and serving on it.

Domains you manage on Dbrij live on the Domains page in the rail. Pointing a domain at an app leaves any mail DNS you have set up untouched, so the same domain can serve the site and receive email at once.

Storage: use it with any S3 tool and your framework

Dbrij Storage is S3 compatible. You get an endpoint, an access key id and a secret, and every tool that speaks S3 works unchanged: command line clients, the S3 SDKs, sync and backup tools, and the storage drivers built into Laravel, Django, Rails and Next.js. Create a bucket under Storage, make a key under Access keys, and copy the endpoint shown there. Both S3 address forms work: the bucket in the path (s3.dbrij.com/bucket/key, path style) or as a subdomain (bucket.s3.dbrij.com/key, virtual host style). The snippets below use path style.

Environment variables (the names Dbrij writes when an assistant connects Storage)
DBRIJ_KEY_ID=dbsk_...
DBRIJ_KEY_SECRET=dbss_...
DBRIJ_S3_ENDPOINT=https://s3.dbrij.com
DBRIJ_S3_REGION=us-east-1
DBRIJ_BUCKET=photos
AWS CLI
aws configure set aws_access_key_id dbsk_...
aws configure set aws_secret_access_key dbss_...
aws configure set region us-east-1
aws s3 mb s3://photos --endpoint-url https://s3.dbrij.com
aws s3 cp ./photo.jpg s3://photos/2026/photo.jpg --endpoint-url https://s3.dbrij.com
aws s3 sync ./public s3://photos/site --endpoint-url https://s3.dbrij.com
rclone
[dbrij]
type = s3
provider = Other
access_key_id = dbsk_...
secret_access_key = dbss_...
endpoint = https://s3.dbrij.com
region = us-east-1
force_path_style = true

rclone copy ./backups dbrij:photos/backups
Laravel (config/filesystems.php and .env)
'dbrij' => [
    'driver' => 's3',
    'key' => env('DBRIJ_KEY_ID'),
    'secret' => env('DBRIJ_KEY_SECRET'),
    'region' => env('DBRIJ_S3_REGION', 'us-east-1'),
    'bucket' => env('DBRIJ_BUCKET'),
    'endpoint' => env('DBRIJ_S3_ENDPOINT'),
    'use_path_style_endpoint' => true,
],

Storage::disk('dbrij')->put('2026/photo.jpg', $bytes);
Django (the storages package, settings.py)
import os

AWS_ACCESS_KEY_ID = os.environ["DBRIJ_KEY_ID"]
AWS_SECRET_ACCESS_KEY = os.environ["DBRIJ_KEY_SECRET"]
AWS_STORAGE_BUCKET_NAME = os.environ["DBRIJ_BUCKET"]
AWS_S3_ENDPOINT_URL = os.environ["DBRIJ_S3_ENDPOINT"]
AWS_S3_REGION_NAME = os.environ.get("DBRIJ_S3_REGION", "us-east-1")
AWS_S3_ADDRESSING_STYLE = "path"
STORAGES = {
    "default": {"BACKEND": "storages.backends.s3.S3Storage"},
    "staticfiles": {"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage"},
}
Node (AWS SDK v3)
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';

const s3 = new S3Client({
  endpoint: process.env.DBRIJ_S3_ENDPOINT,
  region: process.env.DBRIJ_S3_REGION,
  forcePathStyle: true,
  credentials: { accessKeyId: process.env.DBRIJ_KEY_ID!, secretAccessKey: process.env.DBRIJ_KEY_SECRET! },
});
await s3.send(new PutObjectCommand({ Bucket: process.env.DBRIJ_BUCKET, Key: '2026/photo.jpg', Body: bytes }));
Rails (config/storage.yml)
dbrij:
  service: S3
  access_key_id: <%= ENV["DBRIJ_KEY_ID"] %>
  secret_access_key: <%= ENV["DBRIJ_KEY_SECRET"] %>
  endpoint: <%= ENV["DBRIJ_S3_ENDPOINT"] %>
  region: <%= ENV.fetch("DBRIJ_S3_REGION", "us-east-1") %>
  bucket: <%= ENV["DBRIJ_BUCKET"] %>
  force_path_style: true

Prefer plain HTTP over an S3 client? The same key works on the REST storage API with a bearer header, and uploads go straight to the store on a signed URL the API hands you.

REST storage API
Authorization: Bearer <accessKeyId>:<secret>

Base: https://api.dbrij.com/api/storage

GET    /api/storage/buckets                              your buckets
POST   /api/storage/buckets                              { "name": "photos" }
GET    /api/storage/buckets/:bucketId/objects?prefix=    list objects
POST   /api/storage/buckets/:bucketId/upload-url         { "key": "2026/photo.jpg", "contentType": "image/jpeg" }
       → { url, method: "PUT", headers }  then PUT the bytes to url with those headers
POST   /api/storage/buckets/:bucketId/confirm            { "key": "2026/photo.jpg" }  records the real size
GET    /api/storage/buckets/:bucketId/object?key=        302 to a short lived download URL
DELETE /api/storage/buckets/:bucketId/object?key=        delete
  • Supported: creating, listing and deleting buckets, uploading and downloading objects of any size (multipart included), ranged downloads, deleting many objects at once, presigned URLs, and copying an object inside the store without downloading it.
  • Versioning: turn it on per bucket (PutBucketVersioning, or aws s3api put-bucket-versioning). From then on every overwrite or delete, from the dashboard, the REST API, presets, imports or S3, keeps the previous bytes as a version you can list, fetch by versionId or bring back over S3 by deleting the delete marker. There is no restore button yet. Versions are stored bytes and count toward your storage.
  • Bucket policies and ACLs: a policy that grants everyone s3:GetObject on the whole bucket makes it public, the same switch as the dashboard, and a grant on a prefix (arn:aws:s3:::bucket/public/*) makes just that prefix public. An empty policy or a private ACL makes it private. Grants to named principals or with conditions are refused with the reason rather than accepted and not enforced. Give other people their own access keys instead.
  • Lifecycle rules: expire objects under a prefix after N days, remove previous versions after N days, and clear delete markers that hide nothing, with the usualaws s3api put-bucket-lifecycle-configuration. Dbrij runs the sweep every hour. Storage class transitions and tag filters are refused, since there is one class and no tags.
  • Keys made before S3 support show a REST only tag on the keys page and work on the REST API but not with S3 tools. Make a new key for those.
  • Any region name works. The region is part of the signature, not a location; pick one and keep it consistent in your config.
  • Billing is per GB stored per month past your plan's allowance, plus per GB served past the monthly transfer allowance on paid plans. Free never bills: uploads stop at its storage cap and serving stops at its transfer allowance until next month.

The Insights tab

Every web service carries an Insights tab, so "how is it doing" lives next to the thing that is doing it. It answers three questions:

  • Availability: whether the service is up and staying up.
  • Performance: how it is responding.
  • Audience: who is visiting, from a lightweight analytics beacon. Visitors are counted per day and never tracked across days. The tab includes the installation step for the beacon.

Services that serve HTML also get an SEO tab. For deeper behaviour, replays and funnels, Glass can watch any site you host with one tap, no snippet to paste.

Services talking to each other

Services in one project reach each other by their names inside the cluster; nothing outside the project can. On the project page, Private network adds mTLS between them, from an authority the project keeps in Secrets Key management.

  • Certificates: every service gets a certificate for its names, in /etc/dbrij/mtls, renewed on its own. Use it in your code to call other services and to check who is calling.
  • Required: web services also listen on port 8443 for mTLS, and other services in the project can reach them only there. Your app hears the caller's name from its certificate. Try Certificates first, then move your calls to port 8443 before you require it.
  • Databases keep their passwords and are reached as before.

Good to know

  • Hosting bills through its own plans, on the Billing page, not through the flat product subscription. You start free and upgrade when you need more.
  • Plans are metered. Each plan includes an allowance of compute for the period, sets limits like projects, services per project, replicas, memory and CPU per service, and paid plans meter overage beyond the included allowance. The Usage page shows the current period's meters, so "why is it this much" is answered before the bill arrives.
  • Company projects bill the company. A company space carries its own hosting plan, card and usage, separate from any member's personal plan.
  • Every deploy gets a live URL with automatic HTTPS, custom domains and managed databases are included on plans that carry them, and push to deploy works from GitHub and from Dbrij Source.
  • Email from your app goes through Dbrij Send. Use Dbrij Send's API to send from your own verified domain, with every message tracked.
  • Access is granted per person on the Access page; the owner always has it.

Dbrij is Nigeria’s company operating system: the first Nigerian built platform to put team chat, video meetings, email, HR, tax compliant payroll, customer support, marketing, analytics and cloud hosting in one product on one subscription.

Everything on Dbrij

More from Dbrij