
Overview
Every service in Ardor gets network connectivity out of the box. Services can talk to each other over the internal network, and you can expose them publicly when needed.Internal Network
Services communicate privately using internal URLs. Fast, secure, no internet roundtrip.
Public Access
Expose services to the internet with a public URL for APIs, websites, and webhooks.
How Services Connect
Each service gets two URLs:| URL Type | Format | Use For |
|---|---|---|
| Internal | service-<uuid>:<port> | Service-to-service communication |
| Public | https://<port>-<uuid>.ardor.cloud | Browser access, external clients |
- Internal:
service-11bc044b-cb51-4fe2-b2d3-06e8e04656a0:8080 - Public:
https://8080-11bc044b-cb51-4fe2-b2d3-06e8e04656a0.ardor.cloud
Internal communication is faster and more secure — traffic never leaves Ardor’s network. Use internal URLs whenever services talk to each other.
Internal Network
Services can reach any other service on Ardor’s internal network — if they know the internal URL. Think of the internal URL as a private address: without it, services can’t find each other.You can share internal services between solutions if needed — just share the internal URL. For extra security, add authentication to your service.
Finding Internal URLs
Each service displays its internal URL in the service settings. The format includes a unique identifier:service-11bc044b-cb51-4fe2-b2d3-06e8e04656a0:5432service-a3f2e891-1234-5678-abcd-ef0123456789:6379
Connecting Services
To connect from one service to another, use the internal URL. Store it in an environment variable for flexibility:- Database Connection
- Redis Connection
- API Call
Cross-Service Communication
Backend services can reach any other service by its internal URL:Public vs Private Services
When configuring a service, you choose its visibility:- Public
- Private
When to use:
- Web applications users visit
- APIs external clients call
- Webhook endpoints
- Service gets a public URL:
https://<port>-<uuid>.ardor.cloud - Anyone on the internet can access it
- Still accessible internally too
Port Configuration
Each service listens on a specific port. Ardor passes this as thePORT environment variable.
How Ports Work
- You configure the port in service settings (default: 8080)
- Ardor injects it as
PORTenvironment variable - Your app reads
PORTand listens on it - Both internal and public URLs route to this port
Reading the Port
- Python
- Node.js
- Go
Port in Internal URL
The port is included in the internal URL you get from service settings:Environments
Environments belong to a solution — create as many as you need. Each environment is completely independent with its own services, URLs, and configuration.Environments Guide
Learn how to create and manage environments for dev, staging, production, and feature branches.
Common Patterns
API + Database
Setup:- PostgreSQL service — Private
- API service — Public, connects via internal URL stored in env var
Frontend + Backend + Database (Recommended)
Setup:- PostgreSQL — Private
- Redis — Private
- API Backend — Private, only reachable via internal URL
- Frontend — Public with reverse proxy, routes
/api/*to backend internally
Frontend + Public API (when needed)
If you intentionally need a public API (for external clients, mobile apps, webhooks): Use this when:- External apps need to call your API directly
- You’re building a public API for third parties
- Mobile apps need direct backend access
Microservices
Setup:- Only the API Gateway is public
- All microservices are private, communicate via internal URLs
Troubleshooting
Can't connect to another service
Can't connect to another service
Check:
- Is the target service running? Check its status and logs
- Are you using the correct internal URL and port?
- Are both services in the same environment?
Connection refused errors
Connection refused errors
Cause: Target service isn’t listening on the expected port.Check:
- Is the service reading the
PORTenvironment variable? - Is it binding to
0.0.0.0? - Check the service logs for startup errors
Public URL not working
Public URL not working
Check:
- Is the service set to Public visibility?
- Is the service running and healthy?
- Is it listening on the configured port?
Timeout connecting to database
Timeout connecting to database
Check:
- Is the database service running?
- Are you using the internal URL (not trying to connect externally)?
- Check database logs for connection limit issues
Best Practices
Keep databases private
Keep databases private
Never expose databases to the internet. Always use private visibility and connect via internal URLs.
Keep API backends private when possible
Keep API backends private when possible
Unless you need a public API for external clients, keep your backend private and route requests through your frontend’s reverse proxy. One public endpoint = smaller attack surface.
Use environment variables for URLs
Use environment variables for URLs
Don’t hardcode internal URLs. Store them in variables so you can change them without code changes.
Minimize public services
Minimize public services
Only expose what needs to be public. Fewer public endpoints = smaller attack surface.
Add authentication to sensitive services
Add authentication to sensitive services
Internal URLs with UUIDs are hard to guess, but add authentication for extra security on services that handle sensitive data.

