If you run GraphHopper you can access the UI but the geocoding and map tiles will be fetched from certain online services.
A while ago I put together a simple docker compose project that wires everything together with a single command and runs the necessary services on a single host.
The project “just” puts together mature and existing open source projects like GraphHopper, GraphHopper Maps, photon, planetiler and tilesserver-gl. It will not reinvent the wheel (i.e. it won’t create a new UI or change the code).
The aim is “simplicity and everything local”. One current drawback is the huge disk size that is required to do so due to the “default” docker overhead. But maybe there are more knowledged people than me that know how to improve this.