Quick tip: Tunneling without Docker (useful for Apple Silicon / M1)

Updated post (May 2023)

To use the Forge tunnel without Docker, follow these steps:

  1. Install the tunnel package globally:
    npm install -g @forge/sandbox-tunnel

  2. Set the FORGE_DEV_TUNNEL environment variable before using the tunnel:
    FORGE_DEV_TUNNEL=true forge tunnel

Unfortunately, the snapshot mechanism sometimes crashes the tunnel when used with Node.js 16 or 18 (the Docker image still uses Node.js 14). If you run into problems, you can disable snapshots in the manifest, but remember to enable them again before you deploy to production.

Alternatively, you can modify a line in the tunnel source code to always disable snapshots during development. If you are using macOS or Linux, run which forge to find the install location of the CLI. For the output <path>/bin/forge, the file you need to modify is <path>/lib/node_modules/@forge/sandbox-tunnel/node_modules/@forge/cli-shared/out/config/config-file.js. Replace the body of the snapshotsEnabled function in this file with return false;. Note that you have to repeat this step every time you install a new version of @forge/sandbox-tunnel.

Original post (September 2021)

After running into a few issues with forge tunnel on an M1 Mac—bad performance and frequent crashes because of Docker’s x64 to ARM emulation—I tried to find a different way to run the tunnel and discovered the FORGE_DEV_TUNNEL environment variable in the CLI’s source code, which allows you to use the tunnel without Docker!

You just need to install the @forge/tunnel package globally and set the environment variable before running forge tunnel:

npm install -g @forge/tunnel
FORGE_DEV_TUNNEL=true forge tunnel

I couldn’t find any documentation about this method, so it may not work with future versions of the CLI but I hope some of you find it useful (at least until there’s an official ARM build for the tunnel). :slightly_smiling_face:

27 Likes

Hi @klaussner ,
Thank you for sharing this solution.

2 Likes

This should be part of the documentation

3 Likes

Hi,
When I’m executing this command:

I get these errors:

npm ERR! code 1
npm ERR! path /Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/@forge/tunnel/node_modules/@forge/isolated-vm
npm ERR! command failed
npm ERR! command sh /tmp/install-280fd815.sh
npm ERR! CXX(target) Release/obj.target/nortti/src/external_copy/serializer_nortti.o
npm ERR!   CXX(target) Release/obj.target/nortti/src/isolate/allocator_nortti.o
npm ERR!   LIBTOOL-STATIC Release/nortti.a
npm ERR!   CXX(target) Release/obj.target/isolated_vm/src/external_copy/external_copy.o
npm ERR!   CXX(target) Release/obj.target/isolated_vm/src/external_copy/serializer.o
npm ERR!   CXX(target) Release/obj.target/isolated_vm/src/external_copy/string.o
npm ERR!   CXX(target) Release/obj.target/isolated_vm/src/isolate/environment.o
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@9.0.0
npm ERR! gyp info using node@16.17.0 | darwin | arm64
npm ERR! gyp info find Python using Python version 3.10.6 found at "/Library/Frameworks/Python.framework/Versions/3.10/bin/python3"
npm ERR! gyp info spawn /Library/Frameworks/Python.framework/Versions/3.10/bin/python3
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   '/Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
npm ERR! gyp info spawn args   'binding.gyp',
npm ERR! gyp info spawn args   '-f',
npm ERR! gyp info spawn args   'make',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/@forge/tunnel/node_modules/@forge/isolated-vm/build/config.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/Users/amityahav/Library/Caches/node-gyp/16.17.0/include/node/common.gypi',
npm ERR! gyp info spawn args   '-Dlibrary=shared_library',
npm ERR! gyp info spawn args   '-Dvisibility=default',
npm ERR! gyp info spawn args   '-Dnode_root_dir=/Users/amityahav/Library/Caches/node-gyp/16.17.0',
npm ERR! gyp info spawn args   '-Dnode_gyp_dir=/Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/npm/node_modules/node-gyp',
npm ERR! gyp info spawn args   '-Dnode_lib_file=/Users/amityahav/Library/Caches/node-gyp/16.17.0/<(target_arch)/node.lib',
npm ERR! gyp info spawn args   '-Dmodule_root_dir=/Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/@forge/tunnel/node_modules/@forge/isolated-vm',
npm ERR! gyp info spawn args   '-Dnode_engine=v8',
npm ERR! gyp info spawn args   '--depth=.',
npm ERR! gyp info spawn args   '--no-parallel',
npm ERR! gyp info spawn args   '--generator-output',
npm ERR! gyp info spawn args   'build',
npm ERR! gyp info spawn args   '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! gyp info spawn make
npm ERR! gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build', '--jobs', 4 ]
npm ERR! ../src/isolate/environment.cc:343:11: error: call to member function 'SetHostImportModuleDynamicallyCallback' is ambiguous
npm ERR!         isolate->SetHostImportModuleDynamicallyCallback(nullptr);
npm ERR!         ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
npm ERR! /Users/amityahav/Library/Caches/node-gyp/16.17.0/include/node/v8.h:8983:8: note: candidate function
npm ERR!   void SetHostImportModuleDynamicallyCallback(
npm ERR!        ^
npm ERR! /Users/amityahav/Library/Caches/node-gyp/16.17.0/include/node/v8.h:8990:8: note: candidate function
npm ERR!   void SetHostImportModuleDynamicallyCallback(
npm ERR!        ^
npm ERR! ../src/isolate/environment.cc:448:11: error: no member named 'RunMicrotasks' in 'v8::Isolate'
npm ERR!         isolate->RunMicrotasks();
npm ERR!         ~~~~~~~  ^
npm ERR! 2 errors generated.
npm ERR! make: *** [Release/obj.target/isolated_vm/src/isolate/environment.o] Error 1
npm ERR! make: *** Waiting for unfinished jobs....
npm ERR! gyp ERR! build error 
npm ERR! gyp ERR! stack Error: `make` failed with exit code: 2
npm ERR! gyp ERR! stack     at ChildProcess.onExit (/Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
npm ERR! gyp ERR! stack     at ChildProcess.emit (node:events:513:28)
npm ERR! gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12)
npm ERR! gyp ERR! System Darwin 21.6.0
npm ERR! gyp ERR! command "/Users/amityahav/.nvm/versions/node/v16.17.0/bin/node" "/Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--release" "-j" "4"
npm ERR! gyp ERR! cwd /Users/amityahav/.nvm/versions/node/v16.17.0/lib/node_modules/@forge/tunnel/node_modules/@forge/isolated-vm
npm ERR! gyp ERR! node -v v16.17.0
npm ERR! gyp ERR! node-gyp -v v9.0.0
npm ERR! gyp ERR! not ok

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/amityahav/.npm/_logs/2022-08-31T06_10_44_107Z-debug-0.log

Any idea what’s the problem here?

1 Like

I have forge CLI 5.0.0, and when I tried to install forge/tunnel, I got these errors:


C:\KC\Workspace\CloudPlugin>npm install -g @forge/tunnel
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@forge/runtime@2.3.0',
npm WARN EBADENGINE   required: { node: '^14' },
npm WARN EBADENGINE   current: { node: 'v16.15.0', npm: '8.5.5' }
npm WARN EBADENGINE }
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN cleanup Failed to remove some directories [
npm WARN cleanup   [
npm WARN cleanup     'C:\\Users\\IGS\\AppData\\Roaming\\npm\\node_modules\\@forge\\tunnel\\node_modules',
npm WARN cleanup     [Error: EPERM: operation not permitted, unlink 'C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\es5-ext\_postinstall.js'] {
npm WARN cleanup       errno: -4048,
npm WARN cleanup       code: 'EPERM',
npm WARN cleanup       syscall: 'unlink',
npm WARN cleanup       path: 'C:\\Users\\IGS\\AppData\\Roaming\\npm\\node_modules\\@forge\\tunnel\\node_modules\\es5-ext\\_postinstall.js'
npm WARN cleanup     }
npm WARN cleanup   ]
npm WARN cleanup ]
npm ERR! code 1
npm ERR! path C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm
npm ERR! command failed
npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node-gyp rebuild --release -j 4
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR!   external_copy.cc
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\nortti.vcxproj]
npm ERR!   serializer_nortti.cc
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\nortti.vcxproj]
npm ERR!   allocator_nortti.cc
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR!   serializer.cc
npm ERR! C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\src\isolate\allocator_nortti.cc(24,36): warning C4146: unary minus operator applied to unsigned type, result still unsigned [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\nortti.vcxproj]
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\nortti.vcxproj]
npm ERR!   win_delay_load_hook.cc
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR!   serializer_nortti.cc
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR!   string.cc
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR!   allocator_nortti.cc
npm ERR!   nortti.vcxproj -> C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\Release\\nortti.lib
npm ERR! C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\src\isolate\allocator_nortti.cc(24,36): warning C4146: unary minus operator applied to unsigned type, result still unsigned [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR! cl : command line  warning D9025: overriding '/GR-' with '/GR' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR!   environment.cc
npm ERR! C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\src\isolate\environment.cc(343,57): error C2668: 'v8::Isolate::SetHostImportModuleDynamicallyCallback': ambiguous call to overloaded function [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR! C:\Users\IGS\AppData\Local\node-gyp\Cache\16.15.0\include\node\v8.h(8990,8): message : could be 'void v8::Isolate::SetHostImportModuleDynamicallyCallback(v8::HostImportModuleDynamicallyWithImportAssertionsCallback)' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR! C:\Users\IGS\AppData\Local\node-gyp\Cache\16.15.0\include\node\v8.h(8983,8): message : or       'void v8::Isolate::SetHostImportModuleDynamicallyCallback(v8::HostImportModuleDynamicallyCallback)' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR! C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\src\isolate\environment.cc(343,57): message : while trying to match the argument list '(nullptr)' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR! C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\src\isolate\environment.cc(448,11): error C2039: 'RunMicrotasks': is not a member of 'v8::Isolate' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR! C:\Users\IGS\AppData\Local\node-gyp\Cache\16.15.0\include\node\v8-platform.h(18): message : see declaration of 'v8::Isolate' [C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm\build\isolated_vm.vcxproj]
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@9.0.0
npm ERR! gyp info using node@16.15.0 | win32 | x64
npm ERR! gyp info find Python using Python version 3.10.6 found at "C:\Users\IGS\AppData\Local\Programs\Python\Python310\python.exe"
npm ERR! gyp info find VS using VS2022 (17.3.32825.248) found at:
npm ERR! gyp info find VS "C:\Program Files\Microsoft Visual Studio\2022\Community"
npm ERR! gyp info find VS run with --verbose for detailed information
npm ERR! gyp info spawn C:\Users\IGS\AppData\Local\Programs\Python\Python310\python.exe
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   'C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\gyp\\gyp_main.py',
npm ERR! gyp info spawn args   'binding.gyp',
npm ERR! gyp info spawn args   '-f',
npm ERR! gyp info spawn args   'msvs',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'C:\\Users\\IGS\\AppData\\Roaming\\npm\\node_modules\\@forge\\tunnel\\node_modules\\@forge\\isolated-vm\\build\\config.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\addon.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'C:\\Users\\IGS\\AppData\\Local\\node-gyp\\Cache\\16.15.0\\include\\node\\common.gypi',
npm ERR! gyp info spawn args   '-Dlibrary=shared_library',
npm ERR! gyp info spawn args   '-Dvisibility=default',
npm ERR! gyp info spawn args   '-Dnode_root_dir=C:\\Users\\IGS\\AppData\\Local\\node-gyp\\Cache\\16.15.0',
npm ERR! gyp info spawn args   '-Dnode_gyp_dir=C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp',
npm ERR! gyp info spawn args   '-Dnode_lib_file=C:\\\\Users\\\\IGS\\\\AppData\\\\Local\\\\node-gyp\\\\Cache\\\\16.15.0\\\\<(target_arch)\\\\node.lib',
npm ERR! gyp info spawn args   '-Dmodule_root_dir=C:\\Users\\IGS\\AppData\\Roaming\\npm\\node_modules\\@forge\\tunnel\\node_modules\\@forge\\isolated-vm',
npm ERR! gyp info spawn args   '-Dnode_engine=v8',
npm ERR! gyp info spawn args   '--depth=.',
npm ERR! gyp info spawn args   '--no-parallel',
npm ERR! gyp info spawn args   '--generator-output',
npm ERR! gyp info spawn args   'C:\\Users\\IGS\\AppData\\Roaming\\npm\\node_modules\\@forge\\tunnel\\node_modules\\@forge\\isolated-vm\\build',
npm ERR! gyp info spawn args   '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! gyp info spawn C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   'build/binding.sln',
npm ERR! gyp info spawn args   '/clp:Verbosity=minimal',
npm ERR! gyp info spawn args   '/nologo',
npm ERR! gyp info spawn args   '/p:Configuration=Release;Platform=x64',
npm ERR! gyp info spawn args   '/m:4'
npm ERR! gyp info spawn args ]
npm ERR! gyp ERR! build error
npm ERR! gyp ERR! stack Error: `C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe` failed with exit code: 1
npm ERR! gyp ERR! stack     at ChildProcess.onExit (C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:194:23)
npm ERR! gyp ERR! stack     at ChildProcess.emit (node:events:527:28)
npm ERR! gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12)
npm ERR! gyp ERR! System Windows_NT 10.0.19044
npm ERR! gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--release" "-j" "4"
npm ERR! gyp ERR! cwd C:\Users\IGS\AppData\Roaming\npm\node_modules\@forge\tunnel\node_modules\@forge\isolated-vm
npm ERR! gyp ERR! node -v v16.15.0
npm ERR! gyp ERR! node-gyp -v v9.0.0
npm ERR! gyp ERR! not ok

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\IGS\AppData\Local\npm-cache\_logs\2022-08-31T08_45_25_505Z-debug-0.log

C:\KC\Workspace\CloudPlugin>

The JavaScript _postinstall.js was marked as malware by CheckPoint endpoint security:

Being able to use tunnel without Docker would be VERY attractive. Docker requires Hyper-V, and Hyper-V messes with VirtualBox, making VM guests extremely slow and unstable. To turn Hyper-V on and off you need to reboot and that’s just annoying.

Unfortunately, installing the tunnel without Docker requires Node.js 14 and won’t work with Node.js 16. I don’t know about Windows but on macOS Monterey you may have to install Python 2 as well to install/compile the package.

That’s great stuff, thanks a lot @klaussner

1 Like

I found a way to run this on M1 macs, still using Docker, but without the performance hits.
Came up with this because of the issues mentioned by @klaussner, Node 14 and Python 2 requirement.

Created a Dockerfile at the root of the forge project.

FROM node:14

USER root

RUN apt update

RUN apt install -y python2

RUN npm config set user root

RUN npm install -g @forge/cli

RUN npm install -g @forge/tunnel

RUN forge settings set usage-analytics false

WORKDIR /app

CMD forge tunnel

Build the docker image by running docker build -t forge/tunnel .

And create a .env file with the following variables

FORGE_EMAIL=
FORGE_API_TOKEN=
FORGE_DEV_TUNNEL=true

Finally launch your tunnel by running
docker run --env-file .env -it -v $PWD:/app -p 8000:8000 forge/tunnel

4 Likes

@klaussner solution worked really well for me on M1 mac.
Unfortunately, this does not work when using client-side-ui-kit and having handler invocations server side :frowning: .

Questions for Atlassian Staff:

  • How come this native tunnelling has not become standard ?
  • Can you at least make the tunnelling docker image native for Apple Silicon ?

Thanks !

3 Likes

@MagdalenaRogulska This is something that the Forge team would address in the future? It’s very frustrating been forced to work with docker on M1 mac.

For everyone having the same problem, you can install @forge/sandbox-tunnel in node 16+ and run FORGE_DEV_TUNNEL=true forge tunnel. It works until you need to use handler invocations as @FabienLydoire said in his post.

In case you need to use handlers in your code, you must use docker with all that this entails (very slow performance) and, in my case (using vite in Custom UI) modify this file:

/home/<user>/.nvm/versions/node/<node version>/lib/node_modules/@forge/cli/out/service/tunnel-service.js

Line 108

const addHostOption = os_1.default.platform() === 'linux' ? ['--add-host', 'host.docker.internal:host-gateway'] : [];

with:

const addHostOption = ['linux', 'darwin'].includes(os_1.default.platform()) ? ['--add-host', 'host.docker.internal:host-gateway'] : [];

And use vite --host in order to stop Forge yelling at me Error: Failed to connect to localhost:<port>. Check that your service is running.

2 Likes

A new version of the Forge runtime is now available in early access that no longer requires Docker to run a local tunnel.

While there are currently still some limitations, and the release is not yet production ready, there are some details here if you’d like to try it out: https://developer.atlassian.com/platform/forge/runtime-reference/native-nodejs-runtime/

4 Likes

Great news @HeyJoe!

And thanks to @klaussner and others for contributing to this topic. I found it quite helpful. Although Docker-based tunnels will be production for a while, I’m going to lock this thread. Going forward, please continue to use forge-tunnel and docker tags on new questions related to tunneling without Docker. Or, if you have questions about the new runtime (without Docker), please use forge-runtime-v2 .

1 Like