# JetBrains IDEs in an air-gapped environment

In networks that restrict access to the internet, you will need to leverage the
JetBrains Client Installer to download and save the IDE clients locally. Please
see the
[JetBrains documentation for more information](https://www.jetbrains.com/help/idea/fully-offline-mode.html).

This page is an example that the Coder team used as a proof-of-concept (POC) of the JetBrains Gateway Offline Mode solution.

We used Ubuntu on a virtual machine to test the steps.
If you have a suggestion or encounter an issue, please
[file a GitHub issue](https://github.com/coder/coder/issues/new?title=request%28docs%29%3A+jetbrains-airgapped+-+request+title+here%0D%0A\&labels=\["community","docs"]\&body=doc%3A+%5Bjetbrains-airgapped%5D%28https%3A%2F%2Fcoder.com%2Fdocs%2Fuser-guides%2Fworkspace-access%2Fjetbrains%2Fjetbrains-airgapped%29%0D%0A%0D%0Aplease+enter+your+request+here%0D%0A).

<div className="fd-steps">
  <div className="fd-step">
    ## Deploy the server and install the Client Downloader [#deploy-the-server-and-install-the-client-downloader]

    Install the JetBrains Client Downloader binary. Note that the server must be a Linux-based distribution:

    ```sh
    wget -O jetbrains-clients-downloader-linux-x86_64.tar.gz \
      'https://data.services.jetbrains.com/products/download?code=JCD&platform=linux_x86-64' && \
    tar -xzvf jetbrains-clients-downloader-linux-x86_64.tar.gz
    ```
  </div>

  <div className="fd-step">
    ## Install backends and clients [#install-backends-and-clients]

    JetBrains Gateway requires both a backend to be installed on the remote host
    (your Coder workspace) and a client to be installed on your local machine. You
    can host both on the server in this example.

    See here for the full
    [JetBrains product list and builds](https://data.services.jetbrains.com/products).
    Below is the full list of supported `--platforms-filter` values:

    ```console
    windows-x64, windows-aarch64, linux-x64, linux-aarch64, osx-x64, osx-aarch64
    ```

    To install both backends and clients, you will need to run two commands.

    ### Backends [#backends]

    ```sh
    mkdir ~/backends
    ./jetbrains-clients-downloader-linux-x86_64-*/bin/jetbrains-clients-downloader --products-filter <product-code> --build-filter <build-number> --platforms-filter linux-x64,windows-x64,osx-x64 --download-backends ~/backends
    ```

    ### Clients [#clients]

    This is the same command as above, with the `--download-backends` flag removed.

    ```sh
    mkdir ~/clients
    ./jetbrains-clients-downloader-linux-x86_64-*/bin/jetbrains-clients-downloader --products-filter <product-code> --build-filter <build-number> --platforms-filter linux-x64,windows-x64,osx-x64 ~/clients
    ```

    We now have both clients and backends installed.
  </div>

  <div className="fd-step">
    ## Install a web server [#install-a-web-server]

    You will need to run a web server in order to serve requests to the backend and
    client files. We installed `nginx` and setup an FQDN and routed all requests to
    `/`. See below:

    ```console
    server {
            listen 80 default_server;
            listen [::]:80 default_server;

            root /var/www/html;

            index index.html index.htm index.nginx-debian.html;

            server_name _;

            location / {
                    root /home/ubuntu;
            }
    }
    ```

    Then, configure your DNS entry to point to the IP address of the server. For the
    purposes of the POC, we did not configure TLS, although that is a supported
    option.
  </div>

  <div className="fd-step">
    ## Add Client Files [#add-client-files]

    You will need to add the following files on your local machine in order for
    Gateway to pull the backend and client from the server.

    ```sh
    $ cat productsInfoUrl # a path to products.json that was generated by the backend's downloader (it could be http://, https://, or file://)

    https://internal.site/backends/<PRODUCT_CODE>/products.json

    $ cat clientDownloadUrl # a path for clients that you got from the clients' downloader (it could be http://, https://, or file://)

    https://internal.site/clients/

    $ cat jreDownloadUrl # a path for JBR that you got from the clients' downloader (it could be http://, https://, or file://)

    https://internal.site/jre/

    $ cat pgpPublicKeyUrl # a URL to the KEYS file that was downloaded with the clients builds.

    https://internal.site/KEYS
    ```

    The location of these files will depend upon your local operating system:

    <OSTab items="[&#x22;macOS&#x22;, &#x22;Linux&#x22;, &#x22;Windows&#x22;]">
      <Tab value="macOS">
        ```console
        # User-specific settings
        /Users/UserName/Library/Application Support/JetBrains/RemoteDev
        # System-wide settings
        /Library/Application Support/JetBrains/RemoteDev/
        ```
      </Tab>

      <Tab value="Linux">
        ```console
        # User-specific settings
        $HOME/.config/JetBrains/RemoteDev
        # System-wide settings
        /etc/xdg/JetBrains/RemoteDev/
        ```
      </Tab>

      <Tab value="Windows">
        ```console
        # User-specific settings
        HKEY_CURRENT_USER registry
        # System-wide settings
        HKEY_LOCAL_MACHINE registry
        ```

        Additionally, create a string for each setting with its appropriate value in
        `SOFTWARE\JetBrains\RemoteDev`:

        ![JetBrains offline - Windows](/beta-docs/images/gateway/jetbrains-offline-windows.png)
      </Tab>
    </OSTab>
  </div>

  <div className="fd-step">
    ## Setup SSH connection with JetBrains Gateway [#setup-ssh-connection-with-jetbrains-gateway]

    With the server now configured, you can now configure your local machine to use
    Gateway. Here is the documentation to
    [setup SSH config via the Coder CLI](/beta-docs/user-guides/workspace-access/#configure-ssh).
    On the Gateway side, follow our guide here until step 16.

    Instead of downloading from jetbrains.com, we will point Gateway to our server
    endpoint. Select `Installation options...` and select `Use download link`. Note
    that the URL must explicitly reference the archive file:

    ![Offline Gateway](/beta-docs/images/gateway/offline-gateway.png)

    Click `Download IDE and Connect`. Gateway should now download the backend and
    clients from the server into your remote workspace and local machine,
    respectively.
  </div>
</div>

## Next steps [#next-steps]

* [Pre-install the JetBrains IDEs backend in your workspace](/beta-docs/admin/templates/extending-templates/jetbrains-preinstall/)
