version: '3.8'

services:
  free5gc-upf:
    container_name: upf
    image: free5gc/upf:v3.3.0
    command: bash -c "./upf-iptables.sh && ./upf -c ./config/upfcfg.yaml"
    volumes:
      - ./config/upfcfg.yaml:/free5gc/config/upfcfg.yaml
      - ./config/upf-iptables.sh:/free5gc/upf-iptables.sh
    cap_add:
      - NET_ADMIN
    networks:
      privnet:
        aliases:
          - upf.free5gc.org

  db:
    container_name: mongodb
    image: mongo
    command: mongod --port 27017
    expose:
      - "27017"
    volumes:
      - dbdata:/data/db
    networks:
      privnet:
        aliases:
          - db

  free5gc-nrf:
    container_name: nrf
    image: free5gc/nrf:v3.3.0
    command: ./nrf -c ./config/nrfcfg.yaml
    expose:
      - "8000"
    volumes:
      - ./config/nrfcfg.yaml:/free5gc/config/nrfcfg.yaml
    environment:
      DB_URI: mongodb://db/free5gc
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - nrf.free5gc.org
    depends_on:
      - db

  free5gc-amf:
    container_name: amf
    image: free5gc/amf:v3.3.0
    command: ./amf -c ./config/amfcfg.yaml
    expose:
      - "8000"
    volumes:
      - ./config/amfcfg.yaml:/free5gc/config/amfcfg.yaml
    environment:
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - amf.free5gc.org
    depends_on:
      - free5gc-nrf

  free5gc-ausf:
    container_name: ausf
    image: free5gc/ausf:v3.3.0
    command: ./ausf -c ./config/ausfcfg.yaml
    expose:
      - "8000"
    volumes:
      - ./config/ausfcfg.yaml:/free5gc/config/ausfcfg.yaml
    environment:
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - ausf.free5gc.org
    depends_on:
      - free5gc-nrf

  free5gc-nssf:
    container_name: nssf
    image: free5gc/nssf:v3.3.0
    command: ./nssf -c ./config/nssfcfg.yaml
    expose:
      - "8000"
    volumes:
      - ./config/nssfcfg.yaml:/free5gc/config/nssfcfg.yaml
    environment:
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - nssf.free5gc.org
    depends_on:
      - free5gc-nrf

  free5gc-pcf:
    container_name: pcf
    image: free5gc/pcf:v3.3.0
    command: ./pcf -c ./config/pcfcfg.yaml
    expose:
      - "8000"
    volumes:
      - ./config/pcfcfg.yaml:/free5gc/config/pcfcfg.yaml
    environment:
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - pcf.free5gc.org
    depends_on:
      - free5gc-nrf

  free5gc-smf:
    container_name: smf
    image: free5gc/smf:v3.3.0
    command: ./smf -c ./config/smfcfg.yaml -u ./config/uerouting.yaml
    expose:
      - "8000"
    volumes:
      - ./config/smfcfg.yaml:/free5gc/config/smfcfg.yaml
      - ./config/uerouting.yaml:/free5gc/config/uerouting.yaml
    environment:
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - smf.free5gc.org
    depends_on:
      - free5gc-nrf
      - free5gc-upf

  free5gc-udm:
    container_name: udm
    image: free5gc/udm:v3.3.0
    command: ./udm -c ./config/udmcfg.yaml
    expose:
      - "8000"
    volumes:
      - ./config/udmcfg.yaml:/free5gc/config/udmcfg.yaml
    environment:
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - udm.free5gc.org
    depends_on:
      - db
      - free5gc-nrf

  free5gc-udr:
    container_name: udr
    image: free5gc/udr:v3.3.0
    command: ./udr -c ./config/udrcfg.yaml
    expose:
      - "8000"
    volumes:
      - ./config/udrcfg.yaml:/free5gc/config/udrcfg.yaml
    environment:
      DB_URI: mongodb://db/free5gc
      GIN_MODE: release
    networks:
      privnet:
        aliases:
          - udr.free5gc.org
    depends_on:
      - db
      - free5gc-nrf

  free5gc-n3iwf:
    container_name: n3iwf
    image: free5gc/n3iwf:v3.3.0
    command: sh -c "./n3iwf-ipsec.sh && ./n3iwf -c ./config/n3iwfcfg.yaml"
    volumes:
      - ./config/n3iwfcfg.yaml:/free5gc/config/n3iwfcfg.yaml
      - ./config/n3iwf-ipsec.sh:/free5gc/n3iwf-ipsec.sh
    environment:
      GIN_MODE: release
    cap_add:
      - NET_ADMIN
    networks:
      privnet:
        aliases:
          - n3iwf.free5gc.org
    depends_on:
      - free5gc-amf
      - free5gc-smf
      - free5gc-upf

  free5gc-webui:
    container_name: webui
    image: free5gc/webui:v3.3.0
    command: ./webui -c ./config/webuicfg.yaml
    volumes:
      - ./config/webuicfg.yaml:/free5gc/config/webuicfg.yaml
    environment:
      - GIN_MODE=release
    networks:
      privnet:
        aliases:
          - webui
    ports:
      - "5000:5000"
    depends_on:
      - db

  ueransim:
    container_name: ueransim
    image: free5gc/ueransim:latest
    #command: ./nr-gnb -c ./config/gnbcfg.yaml
    entrypoint: tail -f /dev/null
    volumes:
      - ./config/gnbcfg.yaml:/ueransim/config/gnbcfg.yaml
    cap_add:
      - NET_ADMIN
    devices:
      - "/dev/net/tun"
    networks:
      privnet:
        aliases:
          - gnb.free5gc.org
    depends_on:
      - free5gc-amf
      - free5gc-upf
  
  ueransim-ue:
    container_name: ueransim-ue
    image: free5gc/ueransim:latest
    #command: ./nr-ue -c ./config/uecfg.yaml -n 1
    entrypoint: tail -f /dev/null
    volumes:
      - ./config/uecfg.yaml:/ueransim/config/uecfg.yaml
    cap_add:
      - NET_ADMIN
    devices:
      - "/dev/net/tun"
    networks:
      privnet:
        aliases:
          - ue.free5gc.org
    depends_on:
      - free5gc-amf
      #- free5gc-upf

networks:
  privnet:
    ipam:
      driver: default
      config:
        - subnet: 10.100.200.0/24
    driver_opts:
      com.docker.network.bridge.name: br-free5gc

volumes:
  dbdata: