From 4e5dff05a63b4ab745f1b79d077fa63d3a90b3da Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Sat, 14 Dec 2019 17:39:00 +0100 Subject: [PATCH] Update doc --- .res/notif-mail.png | Bin 16356 -> 27927 bytes .res/screenshot.png | Bin 0 -> 20006 bytes README.md | 12 +++- doc/configuration.md | 145 ++++++++++++++++++++++++---------------- doc/notifications.md | 16 +++-- doc/providers/docker.md | 102 ++++++++++++++++++++++++++++ doc/providers/static.md | 54 +++++++++++++++ doc/providers/swarm.md | 108 ++++++++++++++++++++++++++++++ doc/todo.md | 5 -- 9 files changed, 373 insertions(+), 69 deletions(-) create mode 100644 .res/screenshot.png create mode 100644 doc/providers/docker.md create mode 100644 doc/providers/static.md create mode 100644 doc/providers/swarm.md delete mode 100644 doc/todo.md diff --git a/.res/notif-mail.png b/.res/notif-mail.png index 75cd7a3271c8a5b3824da68a8253626a152d48c2..1990dfdb6f26b7d36c66b5255e1ddc5293f81be4 100644 GIT binary patch literal 27927 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 z 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 OesWUEk`)r)fBZiZA=eE6 literal 16356 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 diff --git a/.res/screenshot.png b/.res/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..38f432bb94d86bac536a86e8a32ea1a28ddd5e1c GIT binary patch literal 20006 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 z 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 vJFu9-|3@<$PYLCXr&Rb~54Po`: An unique identifier for this provider. + * `endpoint`: Server address to connect to. Local if empty. _Optional_ + * `api_version`: Overrides the client version with the specified one. _Optional_ + * `tls_certs_path`: Path to load the TLS certificates from. _Optional_ + * `tls_verify`: Controls whether client verifies the server's certificate chain and hostname (default: `true`). + * `watch_by_default`: Enable watch by default. If false, containers that don't have `diun.enable=true` label will be ignored (default: `false`). + * `watch_stopped`: Include created and exited containers too (default: `false`). + +* `swarm`: Map of Docker Swarm to watch + * ``: An unique identifier for this provider. + * `endpoint`: Server address to connect to. Local if empty. _Optional_ + * `api_version`: Overrides the client version with the specified one. _Optional_ + * `tls_certs_path`: Path to load the TLS certificates from. _Optional_ + * `tls_verify`: Controls whether client verifies the server's certificate chain and hostname (default: `true`). + * `watch_by_default`: Enable watch by default. If false, services that don't have `diun.enable=true` label will be ignored (default: `false`). + +* `static`: Slice of static image to watch * `name`: Docker image name to watch using `registry/path:tag` format. If registry is omitted, `docker.io` will be used and if tag is omitted, `latest` will be used. **required** * `os`: OS to use. _Optional_. (default: `linux`). * `arch`: Architecture to use. _Optional_. (default: `amd64`). diff --git a/doc/notifications.md b/doc/notifications.md index bd18115a..2216c1ae 100644 --- a/doc/notifications.md +++ b/doc/notifications.md @@ -1,11 +1,23 @@ # Notifications +* [Mail](#mail) +* [Webhook](#webhook) + +## Mail + +Here is an email sample if you add `mail` notification: + +![](../.res/notif-mail.png) + +## Webhook + If you choose `webhook` notification, a HTTP request is sent with a JSON format response that looks like: ```json { "diun_version": "0.3.0", "status": "new", + "provider": "static-0", "image": "docker.io/crazymax/swarm-cronjob:0.2.1", "mime_type": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:5913d4b5e8dc15430c2f47f40e43ab2ca7f2b8df5eee5db4d5c42311e08dfb79", @@ -14,7 +26,3 @@ If you choose `webhook` notification, a HTTP request is sent with a JSON format "os": "linux" } ``` - -And here is an email sample if you add `mail` notification: - -![](../.res/notif-mail.png) diff --git a/doc/providers/docker.md b/doc/providers/docker.md new file mode 100644 index 00000000..2628db93 --- /dev/null +++ b/doc/providers/docker.md @@ -0,0 +1,102 @@ +# Docker provider + +* [About](#about) +* [Quick start](#quick-start) +* [Configuration](#configuration) + +## About + +The Docker provider allows you to analyze the containers of your standalone Docker instance defined in the [Diun configuration](../configuration.md) to extract the images found and check for updates on the registry. + +## Quick start + +In this section we quickly go over a basic docker-compose file using your local docker provider. + +First of all, let's create a Diun configuration we named `diun.yml`: + +```yml +watch: + workers: 20 + schedule: "*/30 * * * *" + +providers: + docker: + mydocker: + watch_stopped: true +``` + +Here we use a single Docker provider with a minimum configuration to analyze labeled containers (watch by default disabled), even stopped ones, of your local Docker instance. + +Now let's create a simple docker-compose file with Diun and some simple services: + +```yml +version: "3.5" + +services: + diun: + image: crazymax/diun:latest + volumes: + - "./data:/data" + - "./diun.yml:/diun.yml:ro" + - "/var/run/docker.sock:/var/run/docker.sock" + environment: + - "TZ=Europe/Paris" + - "LOG_LEVEL=info" + - "LOG_JSON=false" + restart: always + + cloudflared: + image: crazymax/cloudflared:latest + ports: + - target: 5053 + published: 5053 + protocol: udp + - target: 49312 + published: 49312 + protocol: tcp + environment: + - "TZ=Europe/Paris" + - "TUNNEL_DNS_UPSTREAM=https://1.1.1.1/dns-query,https://1.0.0.1/dns-query" + labels: + - "diun.enable=true" + - "diun.watch_repo=true" + restart: always +``` + +As an example we use [crazymax/cloudflared:latest](https://github.com/crazy-max/docker-cloudflared) Docker image. A few [labels](#configuration) are added to configure the image analysis of this container for Diun. Now start this composition with `docker-composes up -d` and take a look at the logs: + +``` +$ docker-compose logs -f +Attaching to bin_diun_1, cloudflared +cloudflared | time="2019-12-14T15:30:07+01:00" level=info msg="Adding DNS upstream" url="https://1.1.1.1/dns-query" +cloudflared | time="2019-12-14T15:30:07+01:00" level=info msg="Adding DNS upstream" url="https://1.0.0.1/dns-query" +cloudflared | time="2019-12-14T15:30:07+01:00" level=info msg="Starting metrics server" addr="[::]:49312" +cloudflared | time="2019-12-14T15:30:07+01:00" level=info msg="Starting DNS over HTTPS proxy server" addr="dns://0.0.0.0:5053" +diun_1 | Sat, 14 Dec 2019 15:30:07 CET INF Starting Diun v2.0.0 +diun_1 | Sat, 14 Dec 2019 15:30:07 CET INF Found 1 docker provider(s) to analyze... +diun_1 | Sat, 14 Dec 2019 15:30:10 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:latest provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.9.0 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.9.1 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.9.2 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.10.1 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.10.4 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.10.2 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.11.0 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:12 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.11.3 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:13 CET INF New image found id=mydocker image=docker.io/crazymax/cloudflared:2019.11.2 provider=docker +diun_1 | Sat, 14 Dec 2019 15:30:13 CET INF Cron initialized with schedule */30 * * * * +diun_1 | Sat, 14 Dec 2019 15:30:13 CET INF Next run in 29 minutes (2019-12-14 16:00:00 +0100 CET) +``` + +## Configuration + +In the same spirit as the [static provider](static.md), you can configure more finely the way to analyze the image of your container. But unlike the static provider, this is done via Docker labels: + +* `diun.enable`: Set to true to enable image analysis of this container. Required if `watch_by_default` is disabled for this provider. +* `diun.os`: OS to use. _Optional_. (default: `linux`). +* `diun.arch`: Architecture to use. _Optional_. (default: `amd64`). +* `diun.regopts_id`: Registry options ID from [`regopts`](../configuration.md#regopts) to use. +* `diun.watch_repo`: Watch all tags of this container image (default: `false`). +* `diun.max_tags`: Maximum number of tags to watch if `diun.watch_repo` enabled. 0 means all of them (default: `0`). +* `diun.include_tags`: Semi-colon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo`. +* `diun.exclude_tags`: Semi-colon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo`. diff --git a/doc/providers/static.md b/doc/providers/static.md new file mode 100644 index 00000000..35139ef3 --- /dev/null +++ b/doc/providers/static.md @@ -0,0 +1,54 @@ +# Static provider + +* [About](#about) +* [Quick start](#quick-start) + +## About + +The static provider is the most basic way to analyse Docker images. Nothing special to see here as everything is configured through the [providers field](../configuration.md#providers). + +## Quick start + +But let's take a look with a simple example: + +```yml +db: + path: diun.db + +watch: + workers: 20 + schedule: "* * * * *" + +regopts: + jfrog: + username: foo + password: bar + +providers: + static: + - name: crazymax/cloudflared + watch_repo: true + - name: docker.bintray.io/jfrog/xray-mongo:3.2.6 + regopts_id: jfrog +``` + +Here we want to analyze all tags of `crazymax/cloudflared` and `docker.bintray.io/jfrog/xray-mongo:3.2.6` tag. Now let's start Diun: + +``` +$ diun --config diun.yml +Sat, 14 Dec 2019 15:32:23 UTC INF Starting Diun 2.0.0 +Sat, 14 Dec 2019 15:32:23 UTC INF Found 2 static provider(s) to analyze... +Sat, 14 Dec 2019 15:32:25 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:latest provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.11.3 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.11.0 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.10.1 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.9.0 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.9.2 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.10.2 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.11.2 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.9.1 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=crazymax/cloudflared image=docker.io/crazymax/cloudflared:2019.10.4 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF New image found id=docker.bintray.io/jfrog/xray-mongo:3.2.6 image=docker.bintray.io/jfrog/xray-mongo:3.2.6 provider=static +Sat, 14 Dec 2019 15:32:28 UTC INF Cron initialized with schedule * * * * * +Sat, 14 Dec 2019 15:32:28 UTC INF Next run in 31 seconds (2019-12-14 15:33:00 +0000 UTC) +``` diff --git a/doc/providers/swarm.md b/doc/providers/swarm.md new file mode 100644 index 00000000..201b5d01 --- /dev/null +++ b/doc/providers/swarm.md @@ -0,0 +1,108 @@ +# Swarm provider + +* [About](#about) +* [Quick start](#quick-start) +* [Configuration](#configuration) + +## About + +The Swarm provider is closely linked to the [Docker provider](docker.md) except that it allows you to analyze the services of your Swarm cluster defined in the [Diun configuration](../configuration.md) to extract the images found and check for updates on the registry. + +## Quick start + +In this section we quickly go over a basic stack using your local swarm cluster. + +First of all, let's create a Diun configuration we named `diun.yml`: + +```yml +watch: + workers: 20 + schedule: "*/30 * * * *" + +providers: + swarm: + myswarm: +``` + +Here we use a single Swarm provider with a minimum configuration to analyze labeled containers (watch by default disabled), of your local Swarm cluster. + +Now let's create a simple stack for Diun: + +```yml +version: "3.5" + +services: + diun: + image: crazymax/diun:latest + volumes: + - "./data:/data" + - "./diun.yml:/diun.yml:ro" + - "/var/run/docker.sock:/var/run/docker.sock" + environment: + - "TZ=Europe/Paris" + - "LOG_LEVEL=info" + - "LOG_JSON=false" + deploy: + placement: + constraints: + - node.role == manager +``` + +And another one with a simple service: + +```yml +version: "3.5" + +services: + nginx: + image: nginx + ports: + - target: 80 + published: 80 + protocol: udp + deploy: + mode: replicated + replicas: 2 + labels: + - "diun.enable=true" + - "diun.watch_repo=true" +``` + +As an example we use [nginx](https://hub.docker.com/_/nginx/) Docker image. A few [labels](#configuration) are added to configure the image analysis of this service for Diun. We can now start these 2 stacks: + +``` +docker stack deploy -c diun.yml diun +docker stack deploy -c nginx.yml nginx +``` + +And watch logs of Diun service: + +``` +$ docker service logs -f diun_diun +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:19:57 CET INF Starting Diun dev +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:19:57 CET INF Starting Diun... +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:19:57 CET INF Found 1 swarm provider(s) to analyze... +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:19:59 CET INF New image found id=myswarm image=docker.io/library/nginx:latest provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:01 CET INF New image found id=myswarm image=docker.io/library/nginx:1.9 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:01 CET INF New image found id=myswarm image=docker.io/library/nginx:1.9.4 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:01 CET INF New image found id=myswarm image=docker.io/library/nginx:1.9.8 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:01 CET INF New image found id=myswarm image=docker.io/library/nginx:1.9.7 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:01 CET INF New image found id=myswarm image=docker.io/library/nginx:1.9.9 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:01 CET INF New image found id=myswarm image=docker.io/library/nginx:1.9.6 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:01 CET INF New image found id=myswarm image=docker.io/library/nginx:1.9.5 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:mainline-alpine provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:alpine-perl provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:stable-perl provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:stable-alpine-perl provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:1 provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:perl provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:mainline-alpine-perl provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:stable provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:mainline-perl provider=swarm +diun_diun.1.i1l4yuiafq6y@docker-desktop | Sat, 14 Dec 2019 16:20:02 CET INF New image found id=myswarm image=docker.io/library/nginx:mainline provider=swarm +... +``` + +## Configuration + +You can configure more finely the way to analyze the image of your service as for the [Docker provider](docker.md) with [Docker labels](docker.md#configuration). diff --git a/doc/todo.md b/doc/todo.md deleted file mode 100644 index 8e7c5b7d..00000000 --- a/doc/todo.md +++ /dev/null @@ -1,5 +0,0 @@ -# TODO - -* [ ] Watch images inside Dockerfile and Compose files -* [ ] Watch images from Docker daemon -* [ ] Watch starred repo on DockerHub and Quay