version: "3"

# Run `docker-compose up dev` for bootstrapping your development environment
# Doing so will expose NBXplorer, Bitcoind RPC and postgres port to the host so that tests can Run,
# The Visual Studio launch setting `Docker-regtest` is configured to use this environment.
services:

  tests:
    build:
      context: ..
      dockerfile: BTCPayServer.Tests/Dockerfile
      args:
        CONFIGURATION_NAME: Release
    environment:
      TESTS_BTCRPCCONNECTION: server=http://bitcoind:43782;ceiwHEbqWI83:DwubwWsoo3
      TESTS_LTCRPCCONNECTION: server=http://litecoind:43782;ceiwHEbqWI83:DwubwWsoo3
      TESTS_BTCNBXPLORERURL: http://nbxplorer:32838/
      TESTS_LTCNBXPLORERURL: http://nbxplorer:32838/
      TESTS_POSTGRES: User ID=postgres;Include Error Detail=true;Host=postgres;Port=5432;Database=btcpayserver
      TESTS_EXPLORER_POSTGRES: User ID=postgres;Include Error Detail=true;Host=postgres;Port=5432;Database=nbxplorer
      TESTS_MAILPIT_HOST: mailpit
      TESTS_MAILPIT_SMTP: 1025
      TESTS_MAILPIT_HTTP: 8025
      TESTS_HOSTNAME: tests
      TESTS_RUN_EXTERNAL_INTEGRATION: ${TESTS_RUN_EXTERNAL_INTEGRATION:-"false"}
      TESTS_AzureBlobStorageConnectionString: ${TESTS_AzureBlobStorageConnectionString:-none}
      TEST_MERCHANTLIGHTNINGD: "type=clightning;server=unix://etc/merchant_lightningd_datadir/lightning-rpc"
      TEST_CUSTOMERLIGHTNINGD: "type=clightning;server=unix://etc/customer_lightningd_datadir/lightning-rpc"
      TEST_MERCHANTLND: "http://merchant_lnd:8080/"
      TESTS_INCONTAINER: "true"
      PLAYWRIGHT_HEADLESS: "true"
      TESTS_SSHCONNECTION: "root@sshd:22"
      TESTS_SSHPASSWORD: ""
      TESTS_SSHKEYFILE: ""
      TESTS_SOCKSENDPOINT: "tor:9050"
      TESTS_ARTIFACTS_DIR: "/tmp/Artifacts"
    expose:
      - "80"
    depends_on:
      - dev
    extra_hosts:
      - "tests:127.0.0.1"
    networks:
      default:
      custom:
        ipv4_address: 172.23.0.18
    volumes:
      - "sshd_datadir:/root/.ssh"
      - "customer_lightningd_datadir:/etc/customer_lightningd_datadir"
      - "merchant_lightningd_datadir:/etc/merchant_lightningd_datadir"
      - "tests_datadir:/tmp/Artifacts"

  # The dev container is not actually used, it is just handy to run `docker-compose up dev` to start all services
  dev:
    image: alpine:3.7
    command: [ "/bin/sh", "-c", "trap : TERM INT; while :; do echo Ready to code and debug like a rockstar!!!; sleep 2073600; done & wait" ]
    depends_on:
      - nbxplorer
      - postgres
      - customer_lightningd
      - merchant_lightningd
      - customer_lnd
      - merchant_lnd
      - sshd
      - tor
      - mailpit

  sshd:
    build:
        context: .
        dockerfile: sshd.Dockerfile
    ports:
        - "21622:22"
    expose:
        - 22
    volumes:
        - "sshd_datadir:/root/.ssh"

  devlnd:
    image: btcpayserver/bitcoin:31.0
    environment:
      BITCOIN_NETWORK: regtest
      BITCOIN_WALLETDIR: "/data/wallets"
      BITCOIN_EXTRA_ARGS: |
        deprecatedrpc=signrawtransaction
        connect=bitcoind:39388
        fallbackfee=0.0002
        rpcallowip=0.0.0.0/0
        unsafesqlitesync=1
    depends_on:
      - nbxplorer
      - postgres
      - customer_lnd
      - merchant_lnd

  mailpit:
    image: axllent/mailpit:v1.27
    ports:
      # Web UI
      - "34218:8025"
      # SMTP
      - "34219:1025"
    environment:
      MP_SMTP_AUTH_ACCEPT_ANY: 1
      MP_SMTP_AUTH_ALLOW_INSECURE: 1

  nbxplorer:
    image: nicolasdorier/nbxplorer:2.6.5
    restart: unless-stopped
    ports:
      - "32838:32838"
    expose:
      - "32838"
    environment:
      NBXPLORER_NETWORK: regtest
      NBXPLORER_CHAINS: "btc,ltc,lbtc"
      NBXPLORER_BTCRPCURL: http://bitcoind:43782/
      NBXPLORER_BTCNODEENDPOINT: bitcoind:39388
      NBXPLORER_BTCRPCUSER: ceiwHEbqWI83
      NBXPLORER_BTCRPCPASSWORD: DwubwWsoo3
      NBXPLORER_LTCRPCURL: http://litecoind:43782/
      NBXPLORER_LTCNODEENDPOINT: litecoind:39388
      NBXPLORER_LTCRPCUSER: ceiwHEbqWI83
      NBXPLORER_LTCRPCPASSWORD: DwubwWsoo3
      NBXPLORER_LBTCRPCURL: "http://elementsd-liquid:19332/"
      NBXPLORER_LBTCNODEENDPOINT: "elementsd-liquid:19444"
      NBXPLORER_LBTCRPCUSER: "liquid"
      NBXPLORER_LBTCRPCPASSWORD: "liquid"
      NBXPLORER_BIND: 0.0.0.0:32838
      NBXPLORER_MINGAPSIZE: 5
      NBXPLORER_MAXGAPSIZE: 10
      NBXPLORER_VERBOSE: 1
      NBXPLORER_POSTGRES: User ID=postgres;Include Error Detail=true;Host=postgres;Port=5432;Database=nbxplorer
      NBXPLORER_NOAUTH: 1
      NBXPLORER_EXPOSERPC: 1
    depends_on:
      - bitcoind
      - litecoind
      - elementsd-liquid


  bitcoind:
    restart: unless-stopped
    image: btcpayserver/bitcoin:31.0
    environment:
      BITCOIN_NETWORK: regtest
      BITCOIN_WALLETDIR: "/data/wallets"
      BITCOIN_EXTRA_ARGS: |-
        rpcuser=ceiwHEbqWI83
        rpcpassword=DwubwWsoo3
        rpcport=43782
        rpcbind=0.0.0.0:43782
        rpcallowip=0.0.0.0/0
        port=39388
        whitelist=0.0.0.0/0
        zmqpubrawblock=tcp://0.0.0.0:28332
        zmqpubrawtx=tcp://0.0.0.0:28333
        deprecatedrpc=signrawtransaction
        fallbackfee=0.0002
        minrelaytxfee=0.00001000
        unsafesqlitesync=1
    ports:
      - "43782:43782"
      - "39388:39388"
    expose:
      - "43782" # RPC
      - "39388" # P2P
      - "28332" # ZMQ
      - "28333" # ZMQ
    volumes:
      - "bitcoin_datadir:/data"

  customer_lightningd:
    image: btcpayserver/lightning:v26.06.1
    stop_signal: SIGKILL
    restart: unless-stopped
    environment:
      EXPOSE_TCP: "true"
      LIGHTNINGD_CHAIN: "btc"
      LIGHTNINGD_NETWORK: "regtest"
      LIGHTNINGD_OPT: |
        developer
        bitcoin-datadir=/etc/bitcoin
        bitcoin-rpcconnect=bitcoind
        announce-addr=customer_lightningd:9735
        log-level=debug
        funding-confirms=1
        dev-fast-gossip
        dev-bitcoind-poll=1
    ports:
      - "30992:9835" # api port
      - "30892:9735" # server port
    expose:
      - "9735" # server port
      - "9835" # api port
    volumes:
      - "bitcoin_datadir:/etc/bitcoin"
      - "customer_lightningd_datadir:/root/.lightning"
    depends_on:
      - bitcoind

  merchant_lightningd:
    image: btcpayserver/lightning:v26.06.1
    stop_signal: SIGKILL
    restart: unless-stopped
    environment:
      EXPOSE_TCP: "true"
      LIGHTNINGD_CHAIN: "btc"
      LIGHTNINGD_NETWORK: "regtest"
      LIGHTNINGD_OPT: |
        developer
        bitcoin-datadir=/etc/bitcoin
        bitcoin-rpcconnect=bitcoind
        announce-addr=merchant_lightningd:9735
        funding-confirms=1
        log-level=debug
        dev-fast-gossip
        dev-bitcoind-poll=1
    ports:
      - "30993:9835" # api port
      - "30893:9735" # server port
    expose:
      - "9735" # server port
      - "9835" # api port
    volumes:
      - "bitcoin_datadir:/etc/bitcoin"
      - "merchant_lightningd_datadir:/root/.lightning"
    depends_on:
      - bitcoind

  postgres:
    image: postgres:18.1
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
    ports:
      - "39372:5432"
    command: ["-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
    expose:
      - "5432"
    volumes:
      - "postgres_test_datadir:/var/lib/postgresql"

  merchant_lnd:
    image: btcpayserver/lnd:v0.21.0-beta
    restart: unless-stopped
    environment:
      LND_CHAIN: "btc"
      LND_ENVIRONMENT: "regtest"
      LND_EXPLORERURL: "http://nbxplorer:32838/"
      LND_REST_LISTEN_HOST: http://merchant_lnd:8080
      LND_EXTRA_ARGS: |
        restlisten=merchant_lnd:8080
        rpclisten=127.0.0.1:10008
        rpclisten=merchant_lnd:10009
        bitcoin.node=bitcoind
        bitcoind.rpchost=bitcoind:43782
        bitcoind.rpcuser=ceiwHEbqWI83
        bitcoind.rpcpass=DwubwWsoo3
        bitcoind.zmqpubrawblock=tcp://bitcoind:28332
        bitcoind.zmqpubrawtx=tcp://bitcoind:28333
        externalip=merchant_lnd:9735
        bitcoin.defaultchanconfs=1
        no-macaroons=1
        debuglevel=debug
        trickledelay=1000
        no-rest-tls=1
    ports:
      - "35531:8080"
      - "30894:9735"
      - "53280:10009"
    expose:
      - "8080"
      - "9735"
      - "10009"
    volumes:
      - "merchant_lnd_datadir:/data"
      - "bitcoin_datadir:/deps/.bitcoin"
    depends_on:
      - bitcoind

  customer_lnd:
    image: btcpayserver/lnd:v0.21.0-beta
    restart: unless-stopped
    environment:
      LND_CHAIN: "btc"
      LND_ENVIRONMENT: "regtest"
      LND_EXPLORERURL: "http://nbxplorer:32838/"
      LND_REST_LISTEN_HOST: http://customer_lnd:8080
      LND_EXTRA_ARGS: |
        restlisten=customer_lnd:8080
        rpclisten=127.0.0.1:10008
        rpclisten=customer_lnd:10009
        bitcoin.node=bitcoind
        bitcoind.rpchost=bitcoind:43782
        bitcoind.rpcuser=ceiwHEbqWI83
        bitcoind.rpcpass=DwubwWsoo3
        bitcoind.zmqpubrawblock=tcp://bitcoind:28332
        bitcoind.zmqpubrawtx=tcp://bitcoind:28333
        externalip=customer_lnd:10009
        bitcoin.defaultchanconfs=1
        no-macaroons=1
        debuglevel=debug
        trickledelay=1000
        no-rest-tls=1
    ports:
      - "35532:8080"
      - "30895:9735"
    expose:
      - "8080"
      - "9735"
      - "10009"
    volumes:
      - "customer_lnd_datadir:/root/.lnd"
      - "bitcoin_datadir:/deps/.bitcoin"
    depends_on:
      - bitcoind

  tor:
    restart: unless-stopped
    image: btcpayserver/tor:0.4.6.5
    container_name: tor
    environment:
        TOR_PASSWORD: btcpayserver
    ports:
        - "9050:9050" # SOCKS
        - "9051:9051" # Tor Control
    volumes:
        - "tor_datadir:/home/tor/.tor"
        - "torrcdir:/usr/local/etc/tor"
        - "tor_servicesdir:/var/lib/tor/hidden_services"

  litecoind:
    restart: unless-stopped
    image: btcpayserver/litecoin:0.18.1
    environment:
      BITCOIN_NETWORK: regtest
      BITCOIN_EXTRA_ARGS: |-
        rpcuser=ceiwHEbqWI83
        rpcpassword=DwubwWsoo3
        regtest=1
        rpcport=43782
        rpcbind=0.0.0.0:43782
        port=39388
        whitelist=0.0.0.0/0
    ports:
      - "43783:43782"
    expose:
      - "43782" # RPC
      - "39388" # P2P

  elementsd-liquid:
      restart: always
      container_name: btcpayserver_elementsd_liquid
      image: btcpayserver/elements:0.21.0.2-4
      environment:
          ELEMENTS_CHAIN: elementsregtest
          ELEMENTS_EXTRA_ARGS: |
              mainchainrpcport=43782
              mainchainrpchost=bitcoind
              mainchainrpcuser=liquid
              mainchainrpcpassword=liquid
              rpcport=19332
              rpcbind=0.0.0.0:19332
              rpcauth=liquid:c8bf1a8961d97f224cb21224aaa8235d$$402f4a8907683d057b8c58a42940b6e54d1638322a42986ae28ebb844e603ae6
              port=19444
              whitelist=0.0.0.0/0
              rpcallowip=0.0.0.0/0
              validatepegin=0
              initialfreecoins=2100000000000000
              con_dyna_deploy_signal=1
              con_dyna_deploy_start=10
      expose:
          - "19332"
          - "19444"
      ports:
          - "19332:19332"
          - "19444:19444"
      volumes:
          - "elementsd_liquid_datadir:/data"

volumes:
    tests_datadir:
    sshd_datadir:
    bitcoin_datadir:
    elementsd_liquid_datadir:
    customer_lightningd_datadir:
    merchant_lightningd_datadir:
    customer_lnd_datadir:
    merchant_lnd_datadir:
    postgres_test_datadir:
    tor_datadir:
    torrcdir:
    tor_servicesdir:

networks:
  default:
    driver: bridge
  custom:
    driver: bridge
    ipam:
      config:
        - subnet: 172.23.0.0/16
