---
title: "Projects and services"
description: "Group the services of one app in a project, and connect them over the project's private network."
canonical_url: "https://harblet.com/docs/deploy/projects-and-services"
---
# Projects and services

> Group the services of one app in a project, and connect them over the project's private network.

A **project** groups the services of one app, such as its web server, its workers and its database. A **service** is one thing that runs in it.

## Create a project

<steps level="3">

### Open Projects

Click **Projects** in the sidebar, then **New project**.

### Name it

Enter a name of up to 64 characters and click **Create project**. Project names are unique within your Harblet.

</steps>

Harblet opens the new project. Its **Services** tab lists the services in it, and the **Settings** tab lets you delete it.

<note>

Projects can't be renamed at the moment.

</note>

## Add a service

On the project's page, click **New service** and choose what to deploy:

<card-group>
<card icon="i-lucide-git-branch" title="Git repository" to="https://harblet.com/docs/deploy/git-repositories">

Harblet builds the repository with its Dockerfile, or with Railpack if it has none.

</card>

<card icon="i-lucide-container" title="Docker image" to="https://harblet.com/docs/deploy/docker-images">

Harblet runs a public image, such as `nginx:latest`.

</card>

<card icon="i-lucide-database" title="Database" to="https://harblet.com/docs/deploy/databases">

PostgreSQL or MySQL in one click.

</card>
</card-group>

Every new service deploys right away. Its card on the project page shows the status of its latest [deployment](https://harblet.com/docs/deploy/deployments).

## Connect services to each other

Services in the same project reach each other over a private network. Each service with a port has an **internal address**, shown on its **Overview** tab under **Connection**:

```text
web-k3x9:3000
```

The first part is the service's internal hostname. Harblet makes it from the service's name when you create the service, plus four random characters. The second part is the service's port. Use the address in the other services' [environment variables](https://harblet.com/docs/deploy/environment-variables), for example:

```bash
API_URL=http://api-m2p7:8080
```

- **Other projects can't reach the address.** Each project is isolated from the others.
- **The internet can't reach it either.** Visitors only reach a service through its [domains](https://harblet.com/docs/deploy/domains).
- **The hostname never changes.** Renaming the service later keeps its internal address.
- **A service without a port has no address.** Set one under **Settings** if other services need to connect to it.

<tip>

Services that only do background work, such as a queue worker, don't need a port.

</tip>

## The service page

Open a service from its project to see its tabs:

<table>
<thead>
  <tr>
    <th>
      Tab
    </th>
    
    <th>
      What it's for
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Overview
      </strong>
    </td>
    
    <td>
      The internal address, or a database's connection details
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Deployments
      </strong>
    </td>
    
    <td>
      Every deployment with its build output and events. See <a href="https://harblet.com/docs/deploy/deployments">
        Deployments and logs
      </a>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Logs
      </strong>
    </td>
    
    <td>
      The live output of the running service
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Environment variables
      </strong>
    </td>
    
    <td>
      See <a href="https://harblet.com/docs/deploy/environment-variables">
        Environment variables
      </a>
      
      . Not for databases.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Domains
      </strong>
    </td>
    
    <td>
      See <a href="https://harblet.com/docs/deploy/domains">
        Domains and HTTPS
      </a>
      
      . Not for databases.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Backups
      </strong>
    </td>
    
    <td>
      See <a href="https://harblet.com/docs/backups/database-backups">
        Database backups
      </a>
      
      . Databases only.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Settings
      </strong>
    </td>
    
    <td>
      Name, source, port, health check, <a href="https://harblet.com/docs/deploy/deploy-hooks">
        deploy hook
      </a>
      
      , and deleting the service
    </td>
  </tr>
</tbody>
</table>

The **Deploy** button at the top right of every tab starts a new deployment.

<note>

Changes under **Settings** and **Environment variables** apply on the next deployment. Saving them doesn't deploy, so click **Deploy** afterwards. Domains apply right away.

</note>

## Delete a service

Open the service's **Settings** tab and click **Delete service**. Harblet deletes the service, its domains, environment variables and deployments.

You can't delete a service while one of its deployments is building or deploying. Wait for it to finish, or [cancel](https://harblet.com/docs/deploy/deployments#cancel-a-deployment) the build.

<caution>

Deleting a database deletes all its data. Its backups stay at their destination, but Harblet no longer lists them.

</caution>

## Delete a project

Open the project's **Settings** tab and click **Delete project**. Harblet deletes the project and all of its services, including their data. This can't be undone.


## Sitemap

See the full [sitemap](https://harblet.com/sitemap.md) for all pages.
