version: '3.1'

services:
  geth-mainnet:                         
    image: ethereum/client-go:v1.10.23
    expose: 
      # HTTP server / GraphQL API 
      - 8545                   
    ports:                      
      - "49545:49545"                                                                                 
      - "49545:49545/udp"  
    command:
      [                                                                                               
        # Blockchain sync mode ("snap", "full" or "light")                                            
        "--syncmode=snap",
        "--port=49545",
        # Megabytes of memory allocated to internal caching                                           
        "--cache=8192",
        # Enable the WS-RPC server         
        "--ws",
        "--ws.port=8545",
        "--ws.addr=0.0.0.0",
        # Enable the HTTP-RPC server      
        "--http",
        "--http.port=8545",
        "--http.addr=0.0.0.0",                     
        "--http.vhosts=*",                         
        # Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.                                                                               
        "--graphql",                               
        "--graphql.vhosts=*",             
        # Enable metrics collection and reporting                                                     
        "--metrics",
        "--metrics.addr=0.0.0.0",
        # Ethereum mainnet
        "--mainnet",                                                                                  
        # Maximum number of network peers (network disabled if set to 0) (default: 50)                
        "--maxpeers=30",
        # The Merge
        "--authrpc.jwtsecret=/jwtsecret",
        "--authrpc.addr=0.0.0.0",
        "--authrpc.vhosts=*"
      ]                                                                                               
    networks:                            
      - chains                                                                                        
    volumes:                                                                                          
      - "geth-mainnet_data:/root/.ethereum"
      - ".jwtsecret:/jwtsecret"
    restart: unless-stopped
    stop_grace_period: 1m
    labels:                     
      - "traefik.enable=true"
      - "traefik.http.middlewares.mainnet-stripprefix.stripprefix.prefixes=/mainnet"                  
      - "traefik.http.services.mainnet.loadbalancer.server.port=8545"                                 
      - "traefik.http.routers.mainnet.entrypoints=websecure"                                          
      - "traefik.http.routers.mainnet.tls.certresolver=myresolver"                                    
      - "traefik.http.routers.mainnet.rule=Host(`$DOMAIN`) && PathPrefix(`/mainnet`)"                 
      - "traefik.http.routers.mainnet.middlewares=mainnet-stripprefix, ipwhitelist"
      - "prometheus-scrape.enabled=true"
      - "prometheus-scrape.port=6060"
      - "prometheus-scrape.job_name=geth-mainnet"
      - "prometheus-scrape.metrics_path=/debug/metrics/prometheus"

  prysm-mainnet:
    image: prysmaticlabs/prysm-beacon-chain:stable
    ports:
      #- "127.0.0.1:3500:3500"
      - "13000:13000"
      - "12000:12000/udp"
    command:
      [                                                                                               
        "--datadir=/data",
        "--jwt-secret=/jwtsecret",
        "--rpc-host=0.0.0.0",
        "--grpc-gateway-host=0.0.0.0",
        "--monitoring-host=0.0.0.0",
        "--checkpoint-sync-url=https://mainnet-checkpoint-sync.stakely.io",
        "--execution-endpoint=http://geth-mainnet:8551",
        "--accept-terms-of-use"
      ]                                                                                               
    networks:                            
      - chains                                                                                        
    volumes:                                                                                          
      - "prysm-mainnet_data:/data"
      - ".jwtsecret:/jwtsecret"
    restart: unless-stopped
    stop_grace_period: 1m

volumes:
    prysm-mainnet_data:
    geth-mainnet_data:
