version: '3.8'
services:
    oai-nrf:
        container_name: "rfsim5g-oai-nrf"
        image: oai-nrf:latest
        environment:
            - NRF_INTERFACE_NAME_FOR_SBI=eth0
            - NRF_INTERFACE_PORT_FOR_SBI=80
            - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
            - NRF_API_VERSION=v1
            - INSTANCE=0
            - PID_DIRECTORY=/var/run
        networks:
            public_net:
                ipv4_address: 192.168.71.130
        volumes:
            - ./nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh
        healthcheck:
            test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh"
            interval: 10s
            timeout: 5s
            retries: 5
    mysql:
        container_name: "rfsim5g-mysql"
        image: mysql:5.7
        volumes:
            - ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
            - ./mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
        environment:
            - TZ=Europe/Paris
            - MYSQL_DATABASE=oai_db
            - MYSQL_USER=test
            - MYSQL_PASSWORD=test
            - MYSQL_ROOT_PASSWORD=linux
        healthcheck:
            test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
            interval: 10s
            timeout: 5s
            retries: 5
        networks:
            public_net:
                ipv4_address: 192.168.71.131
    oai-amf:
        container_name: "rfsim5g-oai-amf"
        image: oai-amf:latest
        environment:
            - TZ=Europe/paris
            - INSTANCE=0
            - PID_DIRECTORY=/var/run
            - MCC=208
            - MNC=99
            - REGION_ID=128
            - AMF_SET_ID=1
            - SERVED_GUAMI_MCC_0=208
            - SERVED_GUAMI_MNC_0=99
            - SERVED_GUAMI_REGION_ID_0=128
            - SERVED_GUAMI_AMF_SET_ID_0=1
            - SERVED_GUAMI_MCC_1=460
            - SERVED_GUAMI_MNC_1=11
            - SERVED_GUAMI_REGION_ID_1=10
            - SERVED_GUAMI_AMF_SET_ID_1=1
            - PLMN_SUPPORT_MCC=208
            - PLMN_SUPPORT_MNC=99
            - PLMN_SUPPORT_TAC=0x0001
            - SST_0=1
            - SD_0=1
            - SST_1=1
            - SD_1=12
            - AMF_INTERFACE_NAME_FOR_NGAP=eth0
            - AMF_INTERFACE_NAME_FOR_N11=eth0
            - SMF_INSTANCE_ID_0=1
            - SMF_FQDN_0=oai-smf
            - SMF_IPV4_ADDR_0=0.0.0.0
            - SMF_HTTP_VERSION_0=v1
            - SELECTED_0=true
            - SMF_INSTANCE_ID_1=2
            - SMF_FQDN_1=oai-smf
            - SMF_IPV4_ADDR_1=0.0.0.0
            - SMF_HTTP_VERSION_1=v1
            - SELECTED_1=false
            - MYSQL_SERVER=192.168.71.131
            - MYSQL_USER=root
            - MYSQL_PASS=linux
            - MYSQL_DB=oai_db
            - OPERATOR_KEY=c42449363bbad02b66d16bc975d77cc1
            - NRF_IPV4_ADDRESS=192.168.71.130
            - NRF_PORT=80
            - NF_REGISTRATION=yes
            - SMF_SELECTION=yes
            - USE_FQDN_DNS=yes
            - NRF_API_VERSION=v1
            - NRF_FQDN=oai-nrf
            - EXTERNAL_AUSF=no
            - AUSF_IPV4_ADDRESS=0.0.0.0
            - AUSF_PORT=80
            - AUSF_API_VERSION=v1
            - AUSF_FQDN=localhost
        depends_on:
            - oai-nrf
            - mysql
        volumes:
            - ./amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
        healthcheck:
            test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh"
            interval: 10s
            timeout: 15s
            retries: 5
        networks:
            public_net:
                ipv4_address: 192.168.71.132
    oai-smf:
        container_name: "rfsim5g-oai-smf"
        image: oai-smf:latest
        entrypoint: /bin/bash -c "/openair-smf/bin/oai_smf -c /openair-smf/bin/oai-smf.conf -o"
        environment:
            - TZ=Europe/Paris
            - INSTANCE=0
            - PID_DIRECTORY=/var/run
            - SMF_INTERFACE_NAME_FOR_N4=eth0
            - SMF_INTERFACE_NAME_FOR_SBI=eth0
            - SMF_INTERFACE_PORT_FOR_SBI=80
            - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
            - SMF_API_VERSION=v1
            - DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
            - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
            - AMF_IPV4_ADDRESS=0.0.0.0
            - AMF_PORT=80
            - AMF_API_VERSION=v1
            - AMF_FQDN=oai-amf
            - UDM_IPV4_ADDRESS=127.0.0.1
            - UDM_PORT=80
            - UDM_API_VERSION=v1
            - UDM_FQDN=localhost
            - UPF_IPV4_ADDRESS=192.168.71.134
            - UPF_FQDN_0=oai-spgwu
            - NRF_IPV4_ADDRESS=192.168.71.130
            - NRF_PORT=80
            - NRF_API_VERSION=v1
            - NRF_FQDN=oai-nrf
            - REGISTER_NRF=yes
            - DISCOVER_UPF=yes
            - USE_FQDN_DNS=yes
        depends_on:
            - oai-nrf
            - oai-amf
        volumes:
            - ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
            - ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
        healthcheck:
            test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
            interval: 10s
            timeout: 5s
            retries: 5
        networks:
            public_net:
                ipv4_address: 192.168.71.133
    oai-spgwu:
        container_name: "rfsim5g-oai-spgwu"
        image: oai-spgwu-tiny:latest
        environment:
            - TZ=Europe/Paris
            - PID_DIRECTORY=/var/run
            - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
            - SGW_INTERFACE_NAME_FOR_SX=eth0
            - PGW_INTERFACE_NAME_FOR_SGI=eth0
            - NETWORK_UE_NAT_OPTION=yes
            - NETWORK_UE_IP=12.1.1.0/24
            - SPGWC0_IP_ADDRESS=192.168.71.133
            - BYPASS_UL_PFCP_RULES=no
            - MCC=208
            - MNC=99
            - MNC03=099
            - TAC=1
            - GTP_EXTENSION_HEADER_PRESENT=yes
            - GW_ID=1
            - REALM=openairinterface.org
            - ENABLE_5G_FEATURES=yes
            - REGISTER_NRF=yes
            - USE_FQDN_NRF=yes
            - UPF_FQDN_5G=oai-spgwu
            - NRF_IPV4_ADDRESS=192.168.71.130
            - NRF_PORT=80
            - NRF_API_VERSION=v1
            - NRF_FQDN=oai-nrf
            - NSSAI_SST_0=1
            - NSSAI_SD_0=1
            - DNN_0=oai
        depends_on:
            - oai-nrf
            - oai-smf
        cap_add:
            - NET_ADMIN
            - SYS_ADMIN
        cap_drop:
            - ALL
        privileged: true
        volumes:
            - ./spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh
        healthcheck:
            test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh"
            interval: 10s
            timeout: 5s
            retries: 5
        networks:
            public_net:
                ipv4_address: 192.168.71.134
            traffic_net:
                ipv4_address: 192.168.72.134
    oai-ext-dn:
        image: ubuntu:bionic
        privileged: true
        container_name: rfsim5g-oai-ext-dn
        entrypoint: /bin/bash -c \
              "apt update; apt install -y procps iptables iproute2 iperf iputils-ping;"\
              "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
              "ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
        depends_on:
            - oai-spgwu
        networks:
            traffic_net:
                ipv4_address: 192.168.72.135
        healthcheck:
            test: /bin/bash -c "ping -c 2 192.168.72.134"
            interval: 10s
            timeout: 5s
            retries: 5
    oai-gnb:
        image: oai-gnb:develop
        privileged: true
        container_name: rfsim5g-oai-gnb
        environment: 
            RFSIMULATOR: server
            USE_SA_TDD_MONO: 'yes'
            GNB_NAME: gnb-rfsim
            TAC: 1
            MCC: '208'
            MNC: '99'
            MNC_LENGTH: 2
            NSSAI_SST: 1
            NSSAI_SD0: 1
            NSSAI_SD1: 112233
            AMF_IP_ADDRESS: 192.168.71.132
            GNB_NGA_IF_NAME: eth0
            GNB_NGA_IP_ADDRESS: 192.168.71.136
            GNB_NGU_IF_NAME: eth0
            GNB_NGU_IP_ADDRESS: 192.168.71.136
            USE_ADDITIONAL_OPTIONS: --sa -E --rfsim
        depends_on:
            - oai-ext-dn
        networks:
            public_net:
                ipv4_address: 192.168.71.136
        healthcheck:
            test: /bin/bash -c "pgrep nr-softmodem"
            interval: 10s
            timeout: 5s
            retries: 5
    oai-nr-ue:
        image: oai-nr-ue:develop
        privileged: true
        container_name: rfsim5g-oai-nr-ue
        environment: 
            RFSIMULATOR: 192.168.71.136
            FULL_IMSI: '208990100001100'
            FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
            OPC: 'C42449363BBAD02B66D16BC975D77CC1'
            DNN: oai
            NSSAI_SST: 1
            NSSAI_SD: 1
            USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod
        depends_on:
            - oai-gnb
        networks:
            public_net:
                ipv4_address: 192.168.71.137
        healthcheck:
            test: /bin/bash -c "pgrep nr-uesoftmodem"
            interval: 10s
            timeout: 5s
            retries: 5

networks:
    public_net:
        driver: bridge
        name: rfsim5g-oai-public-net
        ipam:
            config:
                - subnet: 192.168.71.128/26
        driver_opts:
            com.docker.network.bridge.name: "rfsim5g-public"
    traffic_net:
        driver: bridge
        name: rfsim5g-oai-traffic-net
        ipam:
            config:
                - subnet: 192.168.72.128/26
        driver_opts:
            com.docker.network.bridge.name: "rfsim5g-traffic"