# `docker-gen` User Guide
Use [docker-gen](https://github.com/nginx-proxy/docker-gen) on a target machine to generate RackPeek [**Services
**](/docs/resource-levels#services) YAML from existing docker containers.
The generated YAML can be directly used in RackPeek or with the **Import YAML** tool to merge/replace existing services.
# 1. Setup `docker-gen` project
Clone the RackPeek repoistory or copy the [`docker-gen`](https://github.com/Timmoth/RackPeek/tree/main/docs/docker-gen)
folder from the repository to a machine.
Create a `.env` file next to the provided `compose.yaml` compose stack. All of your docker-gen config will live in this
file.
---
# 2. Configure Docker Daemon Connectivity
docker-gen needs to be able to connect to the Docker Daemon on the target machine in order to generate Service YAML.
## Same Machine
If you created the docker-gen project on the *same machine* Docker is running on then uncomment the volume
`- "/var/run/docker.sock:/tmp/docker.sock"` in the `compose.yaml` file.
## Remote Machine
If you want to generate Services from a *remote machine* Docker is running on your will need a docker **socket-proxy**
container running on the target machine, such
as [tecnativa/docker-socket-proxy](https://github.com/Tecnativa/docker-socket-proxy)
or [wollomatic/socket-proxy](https://github.com/wollomatic/socket-proxy).
The socket-proxy container needs **read-only** access to the **containers** api.
Example
On the remote machine run this compose project:
```yaml
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy
ports: "2375:2375"
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
environment:
- POST=0
- CONTAINERS=1
```
In the docker-gen `compose.yaml` file uncomment environmental variable `- "DOCKER_HOST=${DOCKER_HOST}"` and in your
`.env` set it to `tcp://HOST:IP` of the target machine IE `tcp://192.168.0.100:2375`
---
# 3. Configure Container Filtering
This step is **optional.**
Use [container filters](https://docs.docker.com/engine/reference/commandline/ps/#filter) to restrict which containers
docker-gen generates Services from.
Filter should be added to `DOCKER_CONTAINER_FILTERS` in your `.env`. Multiple filters can be used by specifying them as
a comma-separated list.
Examples
Only run docker-gen for containers that show up in [homepage](https://gethomepage.dev/):
* filter on label `homepage.name`
```
DOCKER_CONTAINER_FILTERS=label=homepage.name
```
Only run docker-gen for containers that are discovered by Traefik and are currently running:
* filter on label `traefik.http.routers`
* filter on status `running`
```
DOCKER_CONTAINER_FILTERS=label=traefik.http.routers,status=running
```
---
# 4. Add RackPeek Environmental Variables
This step is **optional.**
More RackPeek Service config can be enabled by specifying optional environmental variables in `.env`:
* `RUNS_ON` enables and specifies the name of the [**System**](/docs/resource-levels#systems) the generated Services run
on (`runsOn` in YAML)
* `HOST_IP` enables IP and port in the `network` section of a Service. The IP will always be `HOST_IP` (useful for ports
published on the bridge network)
* IP and port will only be generated if the container binds to `0.0.0.0` (no IP specified) or specifically binds the
ip from `HOST_IP`
* docker-gen will first look for ports `80` and `443`. If these ports aren't published then it uses the first
published port meeting above conditions
---
# 5. Generate Services
With no further configuration `docker-gen` will output generated Services to stdout. To get clean output from docker
compose run:
```bash
docker compose up --no-log-prefix
```
Services can also be written to a file by specifying the last line in `command` in your `compose.yaml`. Uncommment
`"/etc/docker-gen/templates/services.yaml"` to write to `service.yaml` in the same folder as the `docker-gen` project
you created.
---
# Additional Generation Behavior
The `name` for a Service will be parsed from a container in this order:
* label `rackpeek.name`
* label `homepage.name`
* label `org.opencontainers.image.title`
* container name
The `url` for a Service will be parsed from a container in this order:
* label `rackpeek.href`
* label `homepage.href`
* label `caddy`