I do "remote development" all the time. From your Mac you need to connect to the Ubuntu machine with ssh -L 3000:localhost:3000 user@ubuntu.
This may be more difficult from Ipad, I don't know. Keep in mind that if you connect to Plone via Volto, you'll need to configure Plone to access the hostname that's visible in the ipad as a acceptable for CORS purposes. Maybe you'll have to setup setup apache and serve via an internal hostname.
The scenario you want to use is indeed not quite standard.
You are not simply installing the Plone dependencies (aka pip install) but you are installing a non trivial constellation of servers (ZEO, WSGI, Node etc.). Those servers must be configured to know each other and (in your case) must be reachable from another machine. Furthermore you want multiple instances of those.
Configuring a such constellation is not too complicated but every piece must know at least the ip and port of the other pieces it is talking or listening to. This is usually done in the different configuration files.
A container (docker) installation might be a choice to consider. It is pretty configurable and gives you the chance to "test locally".
If you need a different architecture (e.g. installing from the packages) you must cope with the configuration details.
Do not hesitate to ask for help. You will get it here.
The following command will create and run a container with a plone-frontend to access your Plone Site "Plone1". This container will internally run on port 3000 but will publish it on port 3001 to the host.
You can access your Volto Site "Plone 1" with http://10.0.0.123:3001.
If you want a second Plone Site, visit your browser http://10.0.0.123:8080/ and create a second Plone Site "Plone2" (not a Classic UI if you want to access it via Volto)
The following command will create and run a container with a plone-frontend to access your Plone Site "Plone2". This container will internally run on port 3000 but will publish it on port 3002 to the host.
RAZZLE_API_PATH and RAZZLE_INTERNAL_API_PATH are "the classic way" of connecting to Volto to the Plone backend. The new way, the "seamless mode", while developing, declares that "Volto is the api path" and uses the Volto nodejs express server to provide a proxy to the backend Plone. To use the seamless mode, no longer declare the RAZZLE_API_PATH / RAZZLE_INTERNAL_API_PATH and instead use the RAZZLE_DEV_PROXY_API_PATH=http://localhost:8080/Plone2 environment variable.
Just to make it sure: should both RAZZLE_API_PATH and RAZZLE_INTERNAL_API_PATH be avoided and replaced with RAZZLE_DEV_PROXY_API_PATH as follows? I have changed the ip to access it from another machine.
@mekell we still use both in production just fine. But they're not needed for production, if you follow the setup for the "seamless mode", where the browser connect directly to Plone helped by a special nginx rewrite rule, for the ++api++ paths.
For development Volto acts as a proxy for the ++api++ paths, so that's why it needs to know, in case you have a non-standard setup, how to connect to Plone. The standard setup is http://localhost:8080/Plone.
@mekell I've never tried the plone-frontend docker image. But your setup looks fine. I'm more used to docker-compose setup, though, I find them easier to understand. I'd rather have an .yml file than a bunch of flags and switches.