Prerequisites
To create a project on Zenifra, you need:
- a created and verified account
- to be signed in to the console
Accessing Project Creation
In the console sidebar, click + Create Project.
Step 1: Choose the Project Type
Zenifra offers different application types for deployment:
HTTP Application
Ideal for:
- web applications (React, Vue, Angular)
- HTTP servers (Nginx, Apache)
- REST APIs
- Node.js and Python applications via GitHub Repository
- Java, Go, PHP, .NET, Nginx, Apache, and other stacks via OCI Image
Publishing methods
Zenifra offers two ways to publish an HTTP project:
- GitHub Repository: choose
Project SourceasGitHub Repository, then select the repository and branch. If you want every push to that branch to publish automatically, enableauto-deployduring creation. After creation, you can also edit thepre-build,build, andstartcommands on the edit project screen. - OCI Image: provide a standard OCI image (Docker) to publish the application. In this flow, new versions are published by updating the image or tag in the console.
PostgreSQL Database
If you need a managed database, see our tutorial on how to create a PostgreSQL database.
Step 2: Select the Plan
Plans define the available resources and the price of your application. Each plan offers different levels of:
- CPU, Memory, and GPU
- free storage (when available)
- exclusive features (custom subdomain, IP blocklist, etc.)
Payment Models
Choose how you want to pay for your project:
| Model | Description | Ideal for |
|---|---|---|
| Hourly | Pay for each hour of use. Only pay for the time your application stays active. | Projects with intermittent use, testing, development |
| Monthly | Fixed monthly price. Instance reserved for you during 30 days. | Applications that need to stay always available |
| Yearly | Annual conditions according to the current offer. Instance reserved for long-term projects. | Long-term projects |
Tip: In hourly billing, if your application runs only 10 minutes in the month, you pay only for 1 hour.
Step 3: Configure Basic Information
Project Name
The name is used to:
- identify your project on the dashboard
- create automatic subdomains
Name rules:
- Minimum: 6 characters
- Maximum: 32 characters
- Only lowercase letters, numbers, and hyphens
- Example:
my-web-project,my-company-api
Description
Optional field to add information about the project. It helps organize and identify projects when you have many of them.
Step 4: Configure the Project Source
GitHub Repository
If you selected GitHub Repository, choose the repository, main branch, and application runtime. For Node.js and Python projects, review the pre-build, build, and start commands before creating the project.
auto-deploy is optional. When enabled, every push to the selected branch publishes a new version. When disabled, you control publishing manually from the console.
OCI Image
The OCI image is the template that will be used to create your instance. You can use public or private images.
Public Image
Images that do not require authentication to download. Examples:
docker.io/nginxinc/nginx-unprivileged:stable-alpine
docker.io/metabase/metabase:v0.50.0
docker.io/wordpress:6.5.3-php8.2-apacheFor NGINX, use the nginxinc/nginx-unprivileged image because OCI images on Zenifra should not run the main process as root.
Private Image
For images in private registries, you need to configure authentication:
Option 1: AWS ECR
- AWS region where your repository is located
- Access Key ID and Secret Access Key
- Your AWS account ID
Option 2: Username and Token
- Registry username
- Access token or password
Important: Always use specific tags (such as
v1.2.3) instead oflatest. This ensures that your application always uses the same image version.
Step 5: Configure Port and Instances
Application Port
The port your application listens on internally. External traffic (HTTP/HTTPS on ports 80 and 443) is routed to that port.
Common ports by technology:
| Technology | Default Port |
|---|---|
| Node.js | 3000 |
| Python Flask | 5000 |
| Java/Spring | 8080 |
| Nginx | 80 |
Number of Instances
Number of replicas for your application:
- 1 instance: ideal for low-traffic applications or testing
- 2+ instances: high availability and load balancing
Recommendation: For production applications, use at least 2 instances to improve availability in case of failures.
Step 6: Environment Variables
Environment variables (ENVs) are settings that your application can access at runtime. They are useful for:
- sensitive settings (API keys, passwords)
- external API URLs
- settings that change between environments
ENV examples:
DATABASE_URL=postgres://user:pass@host:5432/db
API_KEY=your-key-here
PORT=3000Limit: Up to 50 environment variables per project.
Step 7: Configure Storage
Persistent Storage
Choose "Yes" if your application needs to:
- save files that should survive restarts
- keep user uploads
Choose "No" for applications where data is ephemeral (such as stateless web servers).
Note: Persistent storage data is replicated across 3 different instances. That means if you save a PDF file and, for some reason, a Zenifra server fails, your locally saved file still remains available.
Storage Capacity
- Minimum: 1 GB
- Maximum: 250 GB
Warning: In hourly billing, storage can only be increased, never reduced. For monthly or yearly contracts, storage cannot be changed after project creation.
Directory to Persist
Absolute path of the directory inside the container whose data will be saved:
/app/data
/var/lib/postgresql/data
/uploadsA common use case for the free storage included in the plan, when available, is storing files in /data, such as temporary imports, generated PDFs, reports, or other artifacts that can be deleted after use.
Important: You can choose the persisted folder when creating the project, but that path cannot be changed later.
Step 8: Configure Domains
Zenifra Subdomain
Plans above Basic include a custom subdomain in the following format:
your-project-sub-domainCustom Domain
You can use your own domain (for example api.yourcompany.com) instead of the default subdomain, but this is configured after the project has already been created and is reachable through the default Zenifra domain.
To configure after creation:
- Open the project settings
- Add your custom domain (for example
api.yourcompany.com) - For subdomains, such as
api.yourcompany.com, configure aCNAMEpointing to the subdomain created by Zenifra - For root domains, such as
yourcompany.com, useCNAMEonly with a provider that supports CNAME flattening, or redirect the root to a subdomain such aswww.yourcompany.com - Publish the SSL validation
TXTrecords shown in the console, if requested
Limit: Up to 20 custom domains per project.
Step 9: Configure Network Access (Premium+ Plans)
This option is available only on specific plans.
Whitelist
Defines which IP addresses can access your project. Non-listed IPs are blocked.
CIDR format:
0.0.0.0/0- Allows all IPsXXX.XXX.XXX.XXX/YY- Allows only that IP and its block
You can add your current IP automatically with one click.
Blacklist
Defines specific IPs that are blocked, even if they are on the whitelist.
Step 10: Finish Creation
- Review all settings
- Click "Create Project"
- Wait a few seconds for creation
After Creation
You will receive:
- Project ID: Unique identifier of your project
- API Key: Key used to authenticate against the Zenifra API
Store the API Key safely! You will need it to manage your project through the API.
Next Steps
FAQ
Can I change the plan after creating the project?
It depends. If the payment model is Hourly, you can change the plan at any time. For monthly or yearly contracts, the change is only allowed at the end of the contracted period.
How do I update my project image?
If the project uses GitHub Repository as the source and auto-deploy is enabled, each push to the selected branch updates the instance automatically. If auto-deploy is disabled, publish manually from the console. If the project uses an OCI image, update the image in the console and publish the new version.
Can I change the pre-build, build, and start commands later?
Yes. In projects with source GitHub Repository, you can edit those commands after creation on the edit project screen.
Can I change the persistence directory later?
No. The directory chosen during creation for persistent storage, such as /data, cannot be changed later.
Can I have multiple projects?
Yes. There is no project limit per account. Each project is billed independently according to its settings.
How do I delete a project?
- Open the specific project page
- Click Delete
- Confirm the action
Warning: This action is irreversible. All data and settings are permanently deleted.
How to Change HTTP Project Settings
Learn how to change your HTTP project settings on Zenifra via console. Name, description, image, ENVs, instances and more.
HTTP Project Metrics and Insights
Learn how to use the HTTP project metrics and insights tab on Zenifra. Monitor CPU, RAM, storage, requests, and logs.