services: $TOR_DOCKER_NAME: image: btcpayserver/tor:0.4.8.10 container_name: $TOR_DOCKER_NAME working_dir: /$TOR_DOCKER_NAME volumes: - $TOR_LOGS_DIR:/var/log/tor - $LECOFFRE_NODE_SCRIPTS_DIR:/scripts:ro networks: btcnet: aliases: - $TOR_DOCKER_NAME healthcheck: test: ["CMD", "sh", "$LECOFFRE_NODE_SCRIPTS_DIR/tor-progress.sh"] interval: 10s timeout: 5s retries: 50 restart: unless-stopped $BITCOIN_DOCKER_NAME: build: ./bitcoin container_name: $BITCOIN_DOCKER_NAME working_dir: /$BITCOIN_DOCKER_NAME depends_on: $TOR_DOCKER_NAME: condition: service_healthy volumes: - $BITCOIN_DATA_DIR:/home/bitcoin/.bitcoin - $BITCOIN_CONF_DIR/bitcoin.conf:/etc/bitcoin/bitcoin.conf - $BITCOIN_LOGS_DIR:/var/log/bitcoin - $LECOFFRE_NODE_SCRIPTS_DIR:/scripts:ro networks: btcnet: aliases: - $BITCOIN_DOCKER_NAME user: root entrypoint: > /bin/sh -c " chown -R bitcoin:bitcoin /home/bitcoin/.bitcoin || echo 'warn: chown partiel (fichiers bind-mount Windows)'; exec su-exec bitcoin bitcoind -conf=/etc/bitcoin/bitcoin.conf -signet" healthcheck: test: ["CMD", "sh", "$LECOFFRE_NODE_SCRIPTS_DIR/bitcoin-progress.sh"] interval: 30s timeout: 10s retries: 50 restart: unless-stopped $BLINDBIT_DOCKER_NAME: image: git.4nkweb.com/4nk/blindbit-oracle:fixed-source container_name: $BLINDBIT_DOCKER_NAME working_dir: /$BLINDBIT_DOCKER_NAME depends_on: bitcoin: condition: service_healthy volumes: - $BLINDBIT_DATA_DIR:/root/.blindbit-oracle # - $LECOFFRE_NODE_CONFS_DIR/blindbit-oracle/blindbit.toml:/tmp/blindbit.toml:ro - $BITCOIN_DATA_DIR:/home/bitcoin/.bitcoin - $BLINDBIT_LOGS_DIR:/var/log/blindbit entrypoint: > sh -c "mkdir -p /root/.blindbit-oracle && if [ ! -f /root/.blindbit-oracle/blindbit.toml ]; then cp /tmp/blindbit.toml /root/.blindbit-oracle/blindbit.toml; fi && echo 'Starting BlindBit Oracle with corrected host binding...' && exec ./main -datadir /root/.blindbit-oracle" networks: btcnet: aliases: - $BLINDBIT_DOCKER_NAME ports: - "0.0.0.0:$BLINDBIT_EXTERNAL_PORT" healthcheck: test: ["CMD", "sh", "$LECOFFRE_NODE_SCRIPTS_DIR/blindbit-progress.sh"] interval: 10s timeout: 5s retries: 60 start_period: 180s restart: unless-stopped $SDK_RELAY_DOCKER_NAME: image: git.4nkweb.com/4nk/sdk_relay:ext container_name: $SDK_RELAY_DOCKER_NAME working_dir: /$SDK_RELAY_DOCKER_NAME env_file: - $SDK_RELAY_CONF_DIR/.env depends_on: $BLINDBIT_DOCKER_NAME: condition: service_healthy volumes: - $SDK_RELAY_CONF_DIR/.conf:/SDK_RELAY_DOCKER_NAME/.conf:ro - $SDK_RELAY_DATA_DIR:/SDK_RELAY_DOCKER_NAME/.4nk - $BITCOIN_DATA_DIR:/SDK_RELAY_DOCKER_NAME/.bitcoin - $SDK_RELAY_LOGS_DIR:/var/log/sdk_relay ports: - "0.0.0.0:$SDK_RELAY_PORT" networks: btcnet: aliases: - $SDK_RELAY_DOCKER_NAME logging: driver: "json-file" options: max-size: "10m" max-file: "3" healthcheck: test: ["CMD", "sh", "$LECOFFRE_NODE_SCRIPTS_DIR/sdk-relay-progress.sh"] interval: 30s timeout: 10s retries: 50 restart: unless-stopped $LECOFFRE_FRONT_DOCKER_NAME: image: git.4nkweb.com/4nk/lecoffre-front:ext container_name: $LECOFFRE_FRONT_DOCKER_NAME working_dir: /$LECOFFRE_FRONT_DOCKER_NAME env_file: - $LECOFFRE_NODE_CONFS_DIR/.env ports: - "0.0.0.0:$LECOFFRE_FRONT_EXTERNAL_PORT:8080" volumes: - $LECOFFRE_NODE_LOGS_DIR/lecoffre-front:/var/log/lecoffre-front networks: btcnet: aliases: - lecoffre-front depends_on: ihm_client: condition: service_healthy sdk_storage: condition: service_healthy user: lecoffreuser command: ["sh", "-c", "exec npm run start >> /var/log/lecoffre-front/stdout.log 2>&1"] healthcheck: test: ["CMD", "sh", "-c", "if ps aux | grep -v grep | grep next-server >/dev/null 2>&1; then echo 'LeCoffre Frontend ready: Next.js server running'; exit 0; else echo 'LeCoffre Frontend starting: Next.js server not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 50 start_period: 30s labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped ihm_client: image: git.4nkweb.com/4nk/ihm_client:ext container_name: ihm_client env_file: - $LECOFFRE_NODE_CONFS_DIR/ihm_client/.env ports: - "0.0.0.0:$IHM_CLIENT_EXTERNAL_PORT:3003" volumes: - $LECOFFRE_NODE_LOGS_DIR/ihm_client:/var/log/ihm_client networks: btcnet: aliases: - ihm_client depends_on: sdk_relay: condition: service_healthy sdk_storage: condition: service_healthy user: root command: ["sh", "-c", "exec npm start >> /var/log/ihm_client/stdout.log 2>&1"] healthcheck: test: ["CMD", "sh", "-c", "if curl -f http://localhost:3003/ >/dev/null 2>&1; then echo 'IHM Client ready: Vite dev server responding'; exit 0; else echo 'IHM Client starting: Vite dev server not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 50 start_period: 30s labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped sdk_storage: image: git.4nkweb.com/4nk/sdk_storage:ext container_name: sdk_storage ports: - "0.0.0.0:$SDK_STORAGE_EXTERNAL_PORT:8080" volumes: - sdk_storage_data:/app/data - $LECOFFRE_NODE_LOGS_DIR/sdk_storage:/var/log/sdk_storage healthcheck: test: ["CMD", "sh", "-c", "if curl -f http://localhost:8080/health >/dev/null 2>&1; then echo 'SDK Storage ready: API responding'; exit 0; else echo 'SDK Storage starting: API not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 50 start_period: 30s networks: btcnet: aliases: - sdk_storage labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped watchtower: image: containrrr/watchtower container_name: watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock command: --interval 30 --label-enable networks: - btcnet restart: unless-stopped signet_miner: build: context: ./miner container_name: signet_miner depends_on: bitcoin: condition: service_healthy # env_file: # - $LECOFFRE_NODE_CONFS_DIR/lecoffre_node/.env volumes: - bitcoin_data:/bitcoin:ro - $LECOFFRE_NODE_LOGS_DIR/miner:/var/log/miner networks: btcnet: aliases: - signet_miner profiles: ["miner"] restart: unless-stopped grafana: image: grafana/grafana:latest container_name: grafana ports: - "0.0.0.0:$GRAFANA_EXTERNAL_PORT:3000" volumes: - grafana_data:/var/lib/grafana # - $LECOFFRE_NODE_CONFS_DIR/grafana/provisioning:/etc/grafana/provisioning # - $LECOFFRE_NODE_CONFS_DIR/grafana/dashboards:/var/lib/grafana/dashboards # - $LECOFFRE_NODE_CONFS_DIR/grafana/grafana.ini:/etc/grafana/grafana.ini:ro - $LECOFFRE_NODE_LOGS_DIR:/var/log/lecoffre:ro environment: - GF_SECURITY_ADMIN_PASSWORD=$GRAFANA_ADMIN_PASSWORD - GF_USERS_ALLOW_SIGN_UP=false - GF_SERVER_ROOT_URL=$GRAFANA_URL/ - GF_PLUGINS_PREINSTALL_SYNC=grafana-clock-panel,grafana-simple-json-datasource networks: btcnet: aliases: - grafana depends_on: loki: condition: service_healthy promtail: condition: service_healthy healthcheck: test: ["CMD", "sh", "-c", "if curl -f http://localhost:3000/api/health >/dev/null 2>&1; then echo 'Grafana ready: Dashboard service responding'; exit 0; else echo 'Grafana starting: Dashboard service not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 50 start_period: 60s labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped loki: image: grafana/loki:latest container_name: loki ports: - "0.0.0.0:$LOKI_EXTERNAL_PORT:3100" volumes: - loki_data:/loki # - $LECOFFRE_NODE_CONFS_DIR/loki/loki-config.yaml:/etc/loki/loki-config.yaml:ro command: -config.file=/etc/loki/loki-config.yaml networks: btcnet: aliases: - loki healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:3100/ready"] interval: 30s timeout: 15s retries: 50 start_period: 120s restart: unless-stopped promtail: image: grafana/promtail:latest container_name: promtail volumes: - $LECOFFRE_NODE_LOGS_DIR:$LECOFFRE_NODE_LOGS_DIR:ro # - $LECOFFRE_NODE_CONFS_DIR/promtail/promtail.yml:/etc/promtail/config.yml:ro - /var/run/docker.sock:/var/run/docker.sock command: -config.file=/etc/promtail/config.yml networks: btcnet: aliases: - promtail depends_on: loki: condition: service_healthy healthcheck: test: ["CMD", "sh", "-c", "if [ -f /tmp/positions.yaml ]; then echo 'Promtail ready: Log collection service responding'; exit 0; else echo 'Promtail starting: Log collection service not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 50 start_period: 30s restart: unless-stopped # Service de statut des services status-api: build: context: ./web/status dockerfile: Dockerfile.python container_name: status-api # env_file: # - $LECOFFRE_NODE_CONFS_DIR/monitoring/.env ports: - "0.0.0.0:$STATUS_API_EXTERNAL_PORT:3006" volumes: - ./web/status/api.py:/app/api.py:ro - /var/run/docker.sock:/var/run/docker.sock:ro - $LECOFFRE_NODE_LOGS_DIR:/var/log/lecoffre:ro - $LECOFFRE_NODE_SCRIPTS_DIR:$LECOFFRE_NODE_SCRIPTS_DIR:ro networks: btcnet: aliases: - status-api healthcheck: test: ["CMD", "sh", "-c", "if curl -f http://localhost:3006/api >/dev/null 2>&1; then echo 'Status API ready: Service monitoring API responding'; exit 0; else echo 'Status API starting: Service monitoring API not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 50 start_period: 30s labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped networks: btcnet: name: 4nk_node_btcnet driver: bridge ipam: config: - subnet: 172.20.0.0/16