Managed Resources and Versioned Internal DNS
Managed Postgres, MySQL, MongoDB, Redis, and RabbitMQ services receive a stable private hostname. Your application can use that hostname for the promoted current release or add a version label to reach a specific healthy deployment.
Define resources with the application
The resources section keeps the service configuration and application binding
in one adios.yaml file:
name: aor-api
region: de
resources:
- name: db
template: postgres:16
database: aor
username: aor_api
password: secret://POSTGRES_PASSWORD
- name: redis
template: redis:7
database: "0"
password: secret://REDIS_PASSWORD
- name: rabbitmq
template: rabbitmq:3
database: aor
username: aor_api
password: secret://RABBITMQ_PASSWORD
Adios gives every managed resource a unique App ID. With the example above, the
Postgres resource will normally have an ID similar to aor-api-db, even though
its short resource name is db. Internal DNS uses the unique App ID so another
application can also have a resource named db without sharing its target.
Team ID and VPC ID
team_id identifies the team that owns the application, resources, secrets,
and deployment records. vpc_id identifies the private network in which the
workloads receive addresses and resolve internal services.
They are separate fields, but vpc_id defaults to team_id when you don't set
one:
name: aor-api
team_id: team-a
# vpc_id defaults to team-a
That default produces a current resource name such as:
aor-api-db.de.team-a.svc.internal
If the application explicitly uses vpc_id: production, the corresponding
name is aor-api-db.de.production.svc.internal. DNS labels are normalized to
lowercase, so an uppercase or mixed-case team or VPC ID appears lowercase in a
generated hostname.
Use the injected connection settings
adios up adds engine-native connection settings to the application. For a
Postgres resource named db, the runtime receives values like these:
DB_HOST=aor-api-db.de.<vpc-id>.svc.internal
DB_PORT=5432
DB_DATABASE=aor
DB_USER=aor_api
DB_PASSWORD=<secret reference>
DB_DATABASE_URL=secret://ADIOS_AOR_API_DB_DB_DATABASE_URL
DATABASE_URL=secret://ADIOS_AOR_API_DB_DATABASE_URL
Secret references are resolved for the runtime. The password and derived URL aren't written into source control or returned to a browser.
Each engine also receives a conventional global URL when the application has not supplied its own value:
| Template | Global URL | Native port |
| --- | --- | ---: |
| Postgres / pgvector | DATABASE_URL | 5432 |
| MySQL | DATABASE_URL | 3306 |
| MongoDB | MONGODB_URL | 27017 |
| Redis | REDIS_URL | 6379 |
| RabbitMQ | AMQP_URL | 5672 |
Resource-prefixed variables remain available when an application has more than
one service of the same engine. A resource named sessions, for example, gets
SESSIONS_HOST, SESSIONS_PORT, and SESSIONS_REDIS_URL.
Short names such as DB_HOST=db
Adios runtimes receive DNS search domains for their region and VPC. A standard
system resolver can therefore expand the short name db to names such as
db.de.team-a.svc.internal and db.team-a.svc.internal.
That short name is a friendly service alias, not the unique managed-resource
App ID. It can be ambiguous when two applications in the same VPC both have a
resource named db, and custom DNS clients don't always honor system search
domains. Don't use it as the managed database endpoint.
When a managed resource is named db, Adios normally replaces a plain value
such as DB_HOST=db with the generated App-ID hostname during deployment. Use
the injected DB_HOST or DATABASE_URL. If you need to write the host
explicitly, use aor-api-db.de.team-a.svc.internal for current or
aor-api-db.v1.de.team-a.svc.internal for an exact version. An explicit
secret:// value remains under your control and is not replaced.
Current and exact-version names
The region-qualified forms are the clearest and are what generated managed resource connections use:
| Target | Internal DNS name |
| --- | --- |
| Promoted current release | <app-id>.<region>.<vpc-id>.svc.internal |
| Exact version | <app-id>.<version>.<region>.<vpc-id>.svc.internal |
For a resource with App ID aor-api-db in region de and VPC team-a:
# Promoted current release
aor-api-db.de.team-a.svc.internal
# Exact healthy versions
aor-api-db.v1.de.team-a.svc.internal
aor-api-db.v2.de.team-a.svc.internal
current means the version recorded in the promoted release. It does not mean
the greatest version string. If v2 has been deployed but not promoted, the
unversioned name continues to reach v1. After v2 is promoted, new
connections through the unversioned name reach v2.
The DNS name resolves to a stable service VIP. The internal proxy chooses a healthy replica for the selected App ID, version, region, VPC, native port, and protocol. An established database or queue connection is not moved in place; clients must reconnect before they use a newly promoted target.
Pin a resource version in the manifest
Set version when an application must bind to an exact managed-resource
deployment:
resources:
- name: db
template: postgres:16
version: v1
database: aor
username: aor_api
password: secret://POSTGRES_PASSWORD
The generated host includes .v1. instead of following the unversioned current
name. On a deployment that promotes managed resources, the selected resource
version may also become current. Treat this as an intentional pin or rollback,
not as a read-only inspection switch.
For a diagnostic workload that must compare versions without changing the current pointer, keep its normal credentials in Secret Manager and connect to the explicit version hostname directly.
What a resource version represents
A versioned DNS name selects a runtime deployment. It is not a database snapshot and does not reconstruct historical data. The exact-version name only returns a target when that version has a healthy running replica.
Persistent services are also subject to volume ownership and single-writer
fencing. An older runtime may be stopped or unable to run beside the current
writer. Use managed snapshots and the documented restore workflow when you
need historical data, rather than assuming that v1 is a point-in-time copy.
Network and security boundaries
svc.internalnames are available to deployed workloads on the permitted private VPC network. They are not public database endpoints and normally won't resolve from a developer laptop.- Source-aware DNS prevents a workload from resolving a different VPC's internal service name.
- The hostname is not a credential. Keep passwords and complete connection URLs in Secret Manager.
- A local Docker development deployment may use
host.docker.internaland a published port instead ofsvc.internal. - A resource explicitly configured for an external network does not receive an internal service hostname.
Troubleshooting
The current name has no record. Confirm that the resource has a promoted current release and at least one healthy replica in the requested region. A deployment can exist without being current.
An exact version has no record. Check the complete version label and verify that version is still running and healthy. Retained metadata alone is not enough to create a DNS target.
The name resolves but the connection fails. Use the engine's native port, check the target's readiness, and confirm that the application and resource are in the same VPC. Existing connection pools may also need to reconnect after a promotion.
The application reaches the wrong version. Check the promoted release instead of comparing version strings. Use the explicit version form to test a specific deployment.
Two resources are both named db. Use the generated resource App IDs. The
short name is for manifest variables; the App ID is the unique DNS service key.
See the engine guides for template-specific configuration: PostgreSQL, MySQL, MongoDB, Redis, and RabbitMQ.