Projekte & Automatisierung

Setup Docker-Compose Services

Code:

1. Install Docker 
curl -sSL https://get.docker.com | sh

2. Add permission to Pi User to run Docker Commands 
sudo usermod -aG docker USERNAME

3. IMPORTANT! Install proper dependencies 
sudo apt install libffi-dev libssl-dev -y 
sudo apt install python3-dev -y 
sudo apt install python3 python3-pip -y 
sudo apt install python3-setuptools -y 
sudo apt install python3-wheel -y
sudo apt install python3-cryptography -y
pip3 install wheel

4 Install Docker Compose
sudo pip3 install docker-compose
docker-compose --version

5. Create YAML-File
nano docker-compose.yml

# docker-compose -f docker-compose.yml up -d 
version: "3.7"

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json
    command: watchtower Node-Red grafana root_influxdb_1 bitwarden homeassistant mosquitto root_esphome_1 portainer --schedule '0 0 0 * * *'  --cleanup --debug 
    environment:
      - TZ='Europe/Berlin'
     #- REPO_USER='githubuser' 
     #- REPO_PASS='password'
     #- WATCHTOWER_NOTIFICATIONS=email
     #- WATCHTOWER_NOTIFICATION_EMAIL_FROM=server@Domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_TO=mail@domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=mail@domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=Secret
    restart: unless-stopped


  portainer:
    image: portainer/portainer
    container_name: portainer
    restart: unless-stopped
    command: -H unix:///var/run/docker.sock
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/docker/portainer/data:/data
      - /opt/docker/shared:/shared
    healthcheck:
      disable: true

  homeassistant:
    container_name: homeassistant
    restart: unless-stopped
    image: homeassistant/amd64-homeassistant
    network_mode: "host"
    devices:
      - /dev/ttyUSB*
    volumes:
      - /opt/docker/homeassistant:/config
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "8123:8123"
    privileged: true
    healthcheck:
      disable: true 
    environment:
      - TZ=Europe/Berlin

  mqtt:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    user: "1003:998"
    ports:
      - "1883:1883"
      - "9001:9001"
      - "8883:8883"
    depends_on: 
      - homeassistant
    restart: unless-stopped
    network_mode: host
    volumes:
      - /opt/docker/mosquitto/config:/mosquitto/config
      - /opt/docker/mosquitto/log:/mosquitto/log
      - /opt/docker/mosquitto/data/:/mosquitto/data
      - /etc/localtime:/etc/localtime:ro
    environment:
     - TZ=Europe/Berlin

  bitwarden:
    container_name: bitwarden
    restart: unless-stopped
    image: bitwardenrs/server
    restart: unless-stopped
    volumes:
      - /opt/docker/bitwarden:/data
    environment:
      WEBSOCKET_ENABLED: "true" # Required to use websockets
      SIGNUPS_ALLOWED: "false" # set to false to disable signups
      INVITATIONS_ALLOWED: "true"
      DOMAIN: "http://DOMAIN:PORT"
      WEB_VAULT_ENABLED: "true"
      SHOW_PASSWORD_HINT: "false"
      DOMAIN: "https://DOMAIN:PORT"
      SMTP_HOST: "MAILSERVER"
      SMTP_FROM: "EMAIL"
      SMTP_FROM_NAME: "Bitwarden Server"
      SMTP_PORT: "587"
      SMTP_SSL: "true"
      SMTP_USERNAME: "EMAIL"
      SMTP_PASSWORD: "PASSWORD"
      ROCKET_WORKERS: "15"
      ICON_CACHE_FOLDER: "/opt/docker/bitwarden/icon_cache"
      ATTACMENTS_FOLDER: "/opt/docker/bitwarden/attachments"
    ports:
      - 3012:3012
      - 8088:80
    healthcheck:
      disable: true

  esphome:
    image: esphome/esphome:latest
    network_mode: "host"
    restart: unless-stopped
    environment:
      ESPHOME_DASHBOARD_USE_PING: "true"
    depends_on: 
      - homeassistant
    ports:
      - "6052-6052"
      - "6123-6123"
    volumes:
      - /opt/docker/homeassistant/esphome:/config
    healthcheck:
      disable: true

  influxdb:
    image: influxdb:latest
    restart: unless-stopped
    volumes:
      # Mount for influxdb data directory
      - /opt/docker/influxdb/data:/var/lib/influxdb
    environment:
      - INFLUXDB_DB=home_automation
      - INFLUXDB_HTTP_AUTH_ENABLED=true
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=PASSWORD
    ports:
      - 8086:8086

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    user: "0"
    links:
      - influxdb
    volumes:
      - /opt/docker/grafana:/var/lib/grafana
    # sudo mkdir -p /srv/docker/grafana/data; chown 1003:998 /srv/docker/grafana/data
    ports:
      - 3000:3000
    environment:
      - GF_SERVER_ROOT_URL=DOMAIN:PORT
      - GF_SECURITY_ADMIN_PASSWORD=PASSWORD
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SMTP_ENABLED=true
      - GF_SMTP_HOST=MAILSERVER:587
      - GF_SMTP_USER=EMAIL
      - GF_SMTP_FROM_ADDRESS=EMAIL
      - GF_SMTP_PASSWORD=PASSWORD
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_ALERTING_ERROR_OR_TIMEOUT=keep_state
    depends_on:
      - influxdb

  nodered:
    image: nodered/node-red-docker
    container_name: Node-Red
    restart: unless-stopped
    user: "1000:1000"
    volumes:
      - /opt/docker/nodered:/data
    restart: unless-stopped
    ports:
      - "1880:1880"

6. Run Installation / Update
docker-compose -f docker-compose.yml up -d

7. Optional (NODE-RED Admin Auth in Docker)

7.1 npm install -g --unsafe-perm node-red-admin
7.2 cd /opt/docker/nodered
7.3 node-red-admin hash-pw
7.5 Copy hash-pw
7.4 nano settings.js 

    adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "Enter hash-pw",
            permissions: "*"
        }]
    },

8. Setup influxdb

8.1 docker container ls 
8.2 docker exec -it CONTAINER_NAME_OF_INFLUX influx
8.3 create database DATABASENAME
8.4 show databases
8.5 use DATABASENAME
8.6 select * from WHATEVER_YOU_INPUT
8.7 exit