# digger.yml reference

WARNING

The structure of this digger.yml file is subject to change in future version of digger.

# Structure

There are two main top-level parts of digger.yml, project and services. The project section contains metadata about the active project. The services section contains a list of service metadata. In the snippet bellow we capture the main elements of a typical digger.yml along with comments to explain each field

project:
  name: projectname
services:
  svc:
    service_name: svc1 # The service name, in most cases it will be the same as the toplevel key
    path: . # where the service lives, a path relative to the root repo
    env_files: [] # currently unused, in future will be used to point .env files 
    publicly_accissible: true # whether this is an external or internal service
    service_type: container # the type of the service
    container_port: 5000 # the port which the container listens in. NOTE this is the container port NOT the port exposed to the host
    health_check: /api/v1/hello # An unauthenticated path, required by loadbalancers
    dockerfile: ./Dockerfile # path to dockerfile relative to root repository
    needs: [] # needs specifies
    dependencies: {} # currently unused, in the future will point to other services which this service depends on 

# Defining Resource dependencies

Resources are specified under every service. here is an example where svcA needs one resource and svcB needs another database resource. Names in the spec have to be unique.

services:
    svcA:
        service_name: 
        service_path: 
        needs:
        - database:
            name: x
            engine: postgres
            size: 10gb

    svcB:
        service_name:
        service_path
        needs:
        - database:
            name: y
            engine: mysql
            size: 30gb

Note that two services can optionally share the same resource. This will help reduce infrastructure creation time and the costs incurred. To share resources we can reference other resources using a dollar sign:

services:
    svcA:
        service_name: serviceA
        service_path: ./
        # ...
        needs:
        - database:
            name: x1
            engine: postgres
            size: 10gb

    svcB:
        service_name: seviceB
        service_path: ./serviceB
        needs:
        - database:
            ref: $x1 #<-- database x1 is now accessible by svcB

# Using existing resources

If you want to use existing resources and make them accessible by a service you can do that by specifying this in a top block called existing_resources. This is on a per-environment basis using {environment}.{resource_name} as the key and an arn value

existing_resources:
    - production.mydb: arn_string
    - staging: arn_string