diff --git a/admin_manual/ai/app_recognize.rst b/admin_manual/ai/app_recognize.rst index f2ddb58a988..028b3f394fe 100644 --- a/admin_manual/ai/app_recognize.rst +++ b/admin_manual/ai/app_recognize.rst @@ -97,7 +97,7 @@ recognize_backend ExApp ~~~~~~~~~~~~~~~~~~~~~~~ * Nextcloud v35 or later, and at least *recognize* v13 -* The `AppAPI `_ app with a configured deploy daemon (Docker socket proxy or Harp proxy) +* The `AppAPI `_ app with a configured HaRP deploy daemon * x86-64 host for the deploy daemon; the published container image is built for ``linux/amd64`` * Outbound HTTPS access from the container to ``huggingface.co``, since the models are downloaded on first use * Using GPU processing is supported, but not required; expect slow performance on CPU, especially for video diff --git a/admin_manual/exapps_management/AppAPIAndExternalApps.rst b/admin_manual/exapps_management/AppAPIAndExternalApps.rst index 10552ca9117..127a53ae852 100644 --- a/admin_manual/exapps_management/AppAPIAndExternalApps.rst +++ b/admin_manual/exapps_management/AppAPIAndExternalApps.rst @@ -26,7 +26,7 @@ Setup deploy daemon A Deploy Daemon is the way for Nextcloud to install, communicate with, and control ExApps. .. note:: - If you are using Nextcloud AIO with the "HaRP" or "Docker Socket Proxy" container enabled, a Deploy Daemon will be automatically created and configured to work out-of-the-box. + If you are using Nextcloud AIO with the "HaRP" container enabled, a Deploy Daemon will be automatically created and configured to work out-of-the-box. Otherwise, follow the steps below to set up a Deploy Daemon from the AppAPI admin settings. .. tip:: @@ -39,8 +39,7 @@ A Deploy Daemon is the way for Nextcloud to install, communicate with, and contr HaRP ~~~~ -| This is the newer and the **recommended** way to install ExApps. -| It requires changes in the proxy of your Nextcloud instance. If you don't have access to the proxy, you can use the usual method :ref:`described below `. +HaRP is the deploy daemon for ExApps in Docker. It requires changes in the proxy of your Nextcloud instance. 1. Setup a Docker container called `HaRP `_ that proxies access to Docker and to the ExApps for your Nextcloud instance. Be mindful of changing the values of ``HP_SHARED_KEY`` and ``NC_INSTANCE_URL``, and :ref:`generate your own shared key ` instead of using the example value. 2. Go to AppAPI admin settings. @@ -58,40 +57,36 @@ This is suitable for local setups where the Nextcloud server and the ExApps are The ExApps in this configuration or the ExApp server need not expose any ExApp related port (23000-23999) necessarily to the host, nor do they need to be reachable from the host. They should be able to reach the HaRP container at the FRP port and the Nextcloud instance. For different/remote setups, see deployment configuration examples :doc:`here <./DeployConfigurations>`. -.. note:: - The existing ExApps can be migrated to use the new HaRP proxy following `this guide `_. - .. _ai-app_api_dsp: -Docker Socket Proxy -~~~~~~~~~~~~~~~~~~~~ +Moving ExApps from Docker Socket Proxy to HaRP +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -1. Setup a Docker container called `docker-socket-proxy `_ that proxies access to Docker for your Nextcloud instance. -2. Go to the AppAPI admin settings. -3. Click on the "Register Daemon" button. -4. Fill in the required fields: - - ``Name``: unique name of the Deploy daemon - - ``Display name``: the name that will be displayed in the UI - - ``Deployment method``: by default, you will need to choose ``docker_install`` (``manual_install`` is for development or custom use case of manual ExApp installation) - - ``Daemon Host``: hostname/IP address + port of the Deploy daemon - - ``Nextcloud URL``: autofilled with current domain, you might need to change the protocol to http/https depending on your setup - - ``Set as default daemon``: check if you want set new Deploy daemon as default - - ``Enable https``: check if your Deploy daemon (Docker Socket Proxy) is configured with TLS - - Deploy Config: - - ``Network``: Docker network name, depends on your networking setup, enforces to "host" if "Enable https" is checked - - ``HaProxy password``: password for Docker Socket Proxy, if it is configured with TLS - - ``Compute Device``: CPU, CUDA or ROCm, depending on your hardware config on Deploy daemon host machine - - ``Add additional option`` (see :ref:`additional_options_list`): setup additional KEY + VALUE deploy config options -5. Click "Check connection" to verify that the configuration is correct. -6. Click "Register" to save the Deploy Daemon configuration. +AppAPI no longer supports ``docker-install`` deploy daemons without HaRP: Docker Socket Proxy (DSP) daemons and +daemons on a local Docker socket. Registering one is refused. Existing ones stay registered and Nextcloud still reaches +their ExApps, but AppAPI no longer manages these ExApps: -.. note:: - For remote DSP setup, it should expose the ports on the host. +* Installing or updating an ExApp, "Test deploy" and downloading logs fail with a "no longer supported" error. +* Enabling an ExApp only checks its heartbeat and does not start its container. +* Disabling an ExApp leaves its container running. +* Removing an ExApp keeps its container and data volume. +* These daemons can only be deleted: editing them and their Docker registry mappings is refused. -.. image:: ./img/app_api_3.png - :alt: AppAPI admin settings showing Deploy Daemon configuration form with Check connection button +The **AppAPI Docker Socket Proxy daemons** setup check lists these daemons, and the **AppAPI deploy daemon** setup check +reports a default daemon without HaRP. -Deployment configuration examples can be found :doc:`here <./DeployConfigurations>`. +To move the ExApps of such a daemon to HaRP: + +1. Install :ref:`HaRP ` on the Docker host of the old daemon and register a HaRP deploy daemon. +2. Check it with "Test deploy" in the 3-dots menu of the HaRP daemon. +3. Set the HaRP daemon as the default. +4. Remove each ExApp of the old daemon and keep its data: run ``occ app_api:app:unregister `` without + ``--rm-data``. +5. Install the ExApps again. They are installed on the HaRP daemon, which replaces the ``nc_app_`` container and + reuses the ``nc_app__data`` volume. +6. Delete the old daemon in the AppAPI admin settings, then remove its DSP container, if any. + +An ExApp that you do not install again keeps its old container running. Remove that container by hand. Installing ExApps ----------------- @@ -119,40 +114,15 @@ FAQ * No, each ExApp container can only be used for one Nextcloud instance at a time. You would need to run separate containers and even separate docker hosts for each Nextcloud instance. -Docker Socket Proxy vs HaRP ---------------------------- +How HaRP works +-------------- -| HaRP can be seen as Docker Socket Proxy version 2.0. It does all what Docker Socket Proxy does, but also addresses the main pain point of ExApps not being reachable by the Nextcloud server (or AppAPI). | `FRP `_ is used to create a tunnel between the ExApp and the HaRP container so there is no need for the ExApp containers to expose any ports to the host or to be reachable from the Nextcloud server. | The Nextcloud server can reach the ExApp containers through the HaRP container. -HaRP has an additional benefit of being able to proxy requests coming from the Web interface or an API to the ExApp container without being proxied through the Nextcloud server, saving resources, improving performance and supporting additional protocols like WebSockets. - -HaRP is the recommended way to run ExApps, but if you are not able to use it, Docker Socket Proxy is still supported. - -Frontend requests in case of Docker Socket Proxy: - -.. mermaid:: - - graph LR; - subgraph Browser - A[Frontend] - end - - B[Proxy] - - subgraph Services behind the proxy - C[Docker Socket Proxy] - D[ExApp] - E[Nextcloud Server / AppAPI] - end - - A --> B - B -->|Request to an ExApp| E --Converted to ExApp auth--> D - B -->|All other usual requests| E - +HaRP proxies requests coming from the Web interface or an API to the ExApp container without going through the Nextcloud server, saving resources, improving performance and supporting additional protocols like WebSockets. -Frontend requests in case of HaRP: +Frontend requests: .. mermaid:: diff --git a/admin_manual/exapps_management/DeployConfigurations.rst b/admin_manual/exapps_management/DeployConfigurations.rst index 74fbcdd896a..f529d76c268 100644 --- a/admin_manual/exapps_management/DeployConfigurations.rst +++ b/admin_manual/exapps_management/DeployConfigurations.rst @@ -3,9 +3,7 @@ Deployment configurations ========================= -Currently, two kinds of application deployments are supported: - * :ref:`Docker Deploy Daemon (Docker Socket Proxy) ` - * :ref:`Docker Deploy Daemon (HaRP) ` +Docker deployments use the :ref:`Docker Deploy Daemon (HaRP) `. Docker Deploy Daemon -------------------- @@ -18,14 +16,13 @@ Orchestrates the deployment of applications as Docker containers. | These schemes are only examples of possible configurations. | For Docker Deploy Daemon (HaRP), `AppAPI HaRP `_ is required. - | For Docker Deploy Daemon (Docker Socket Proxy), we recommend that you use the `AppAPI Docker Socket Proxy `_ or `AIO Docker Socket Proxy <#nextcloud-in-docker-aio-all-in-one>`_ container for Nextcloud AIO. There are several Docker Daemon Deploy configurations (example schemes): - * Nextcloud and Docker on the **same host** (via socket, DockerSocketProxy, or HaRP) - * Nextcloud on the host and Docker on a **remote** host (via DockerSocketProxy with HTTPS, or HaRP) - * Nextcloud and **ExApps** in the **same Docker network** (via DockerSocketProxy, or HaRP) - * Nextcloud in AIO Docker and **ExApps** in the **same Docker network** (via AIO DockerSocketProxy) + * Nextcloud and Docker on the **same host** + * Nextcloud on the host and Docker on a **remote** host + * Nextcloud and **ExApps** in the **same Docker network** + * Nextcloud in AIO Docker and **ExApps** in the **same Docker network** .. _ai-app_api_ddd-harp: @@ -33,8 +30,7 @@ There are several Docker Daemon Deploy configurations (example schemes): Docker Deploy Daemon (HaRP) --------------------------- -| With HaRP, the ExApps initiate the connection for tunneling to the Nextcloud instance and the HaRP container so there is no need to expose any ports or open any firewall rules. -| See the diagrams of the respective configurations in the :ref:`Docker Deploy Daemon (Docker Socket Proxy) ` section below. +With HaRP, the ExApps initiate the connection for tunneling to the Nextcloud instance and the HaRP container so there is no need to expose any ports or open any firewall rules. A little introduction to the default ports of the HaRP container is given below. More about it can be found in the `HaRP's readme `_. @@ -190,9 +186,6 @@ A setup with the HaRP container itself on the remote is not supported. 9. Start the FRP client with the command: ``frpc -c /path/to/frpc.toml``. 10. Finally, test the whole setup with "Test deploy" in the 3-dots menu of the deploy daemon. -.. _ai-app_api_ddd-dsp: - - Docker / Reverse Proxy / Nextcloud on 3 independent hosts - with HaRP container ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -327,188 +320,6 @@ Finally, test the whole setup with “Test deploy” in the 3-dots menu of the d https://cloud.acme.com/exapps/app_api/v1.41/_ping -Docker Deploy Daemon (Docker Socket Proxy) ------------------------------------------- - -NC & Docker on the Same-Host -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The simplest configuration is when Nextcloud is installed on the host and Docker is on the same host and applications are deployed to it. - -.. mermaid:: - - stateDiagram-v2 - classDef docker fill: #1f97ee, color: white, font-size: 34px, stroke: #364c53, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/docker.png) no-repeat center center / contain - classDef nextcloud fill: #006aa3, color: white, font-size: 34px, stroke: #045987, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/nextcloud.svg) no-repeat center center / contain - classDef python fill: #1e415f, color: white, stroke: #364c53, stroke-width: 1px - - Host - - state Host { - Nextcloud --> Daemon : /var/run/docker.sock - Daemon --> Containers - - state Containers { - ExApp1 - -- - ExApp2 - -- - ExApp3 - } - } - - class Nextcloud nextcloud - class Daemon docker - class ExApp1 python - class ExApp2 python - class ExApp3 python - -Suggested config values(template *Custom default*): - 1. Daemon host: ``/var/run/docker.sock`` - 2. HTTPS checkbox: *not supported using docker socket* - 3. Network: ``host`` - 4. HaProxy password: **not supported using raw docker socket, should be empty** - ---- - -Suggested way to communicate with Docker via `Docker Socket Proxy container `_. - -.. mermaid:: - - stateDiagram-v2 - classDef docker fill: #1f97ee, color: white, font-size: 34px, stroke: #364c53, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/docker.png) no-repeat center center / contain - classDef nextcloud fill: #006aa3, color: white, font-size: 34px, stroke: #045987, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/nextcloud.svg) no-repeat center center / contain - classDef python fill: #1e415f, color: white, stroke: #364c53, stroke-width: 1px - - Host - - state Host { - Nextcloud --> DockerSocketProxy: by port - Docker --> Containers - Docker --> DockerSocketProxy : /var/run/docker.sock - - state Containers { - DockerSocketProxy --> ExApp1 - DockerSocketProxy --> ExApp2 - DockerSocketProxy --> ExApp3 - } - } - - class Nextcloud nextcloud - class Docker docker - class ExApp1 python - class ExApp2 python - class ExApp3 python - -Suggested config values(template *Docker Socket Proxy*): - 1. Daemon host: ``localhost:2375`` - Choose **A** or **B** option: - A. Docker Socket Proxy should be deployed with ``network=host`` and ``BIND_ADDRESS=127.0.0.1`` - B. Docker Socket Proxy should be deployed with ``network=bridge`` and it's port should be published to host's 127.0.0.1(e.g. **-p 127.0.0.1:2375:2375**) - 2. HTTPS checkbox: **disabled** - 3. Network: ``host`` - 4. HaProxy password: **should not be empty** - -.. warning:: - - Be careful with option ``A``, by default **Docker Socket Proxy** binds to ``*`` if ``BIND_ADDRESS`` is not specified during container creation. - Check opened ports after finishing configuration. - - -Docker on a remote host -^^^^^^^^^^^^^^^^^^^^^^^ - -Distributed configuration occurs when Nextcloud is installed on one host and Docker is located on a remote host, resulting in the deployment of applications on the remote host. - -Benefit: no performance impact on Nextcloud host. - -In this case, the AppAPI uses a Docker Socket Proxy deployed on remote host to access docker socket and ExApps. - -.. mermaid:: - - stateDiagram-v2 - classDef docker fill: #1f97ee, color: white, font-size: 34px, stroke: #364c53, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/docker.png) no-repeat center center / contain - classDef nextcloud fill: #006aa3, color: white, font-size: 34px, stroke: #045987, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/nextcloud.svg) no-repeat center center / contain - classDef python fill: #1e415f, color: white, stroke: #364c53, stroke-width: 1px - - Direction LR - - Host1 --> Host2 : by port - - state Host1 { - Nextcloud - } - - state Host2 { - [*] --> DockerSocketProxy : by port - Daemon --> Containers - - state Containers { - [*] --> DockerSocketProxy : /var/run/docker.sock - DockerSocketProxy --> ExApp1 - DockerSocketProxy --> ExApp2 - DockerSocketProxy --> ExApp3 - } - } - - class Nextcloud nextcloud - class Daemon docker - class ExApp1 python - class ExApp2 python - class ExApp3 python - -Suggested config values(template *Docker Socket Proxy*): - 1. Daemon host: ADDRESS_OF_REMOTE_MACHINE (e.g. **server_name.com:2375**) - 2. HTTPS checkbox: ``enabled`` - 3. Network: ``host`` - 4. HaProxy password: **should not be empty** - -NC & ExApps in the same Docker -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Applications are deployed in the same Docker where Nextcloud resides. - -Suggested way to communicate with Docker: via ``docker-socket-proxy``. - -.. mermaid:: - - stateDiagram-v2 - classDef docker fill: #1f97ee, color: white, font-size: 34px, stroke: #364c53, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/docker.png) no-repeat center center / contain - classDef nextcloud fill: #006aa3, color: white, font-size: 34px, stroke: #045987, stroke-width: 1px, background: url(https://raw.githubusercontent.com/nextcloud/documentation/master/admin_manual/exapps_management/img/nextcloud.svg) no-repeat center center / contain - classDef python fill: #1e415f, color: white, stroke: #364c53, stroke-width: 1px - - Host - - state Host { - Daemon --> Containers - - state Containers { - [*] --> DockerSocketProxy : /var/run/docker.sock - Nextcloud --> DockerSocketProxy: by port - -- - DockerSocketProxy --> ExApp1 - DockerSocketProxy --> ExApp2 - } - } - - class Nextcloud nextcloud - class Daemon docker - class ExApp1 python - class ExApp2 python - class ExApp3 python - -Suggested config values(template *Docker Socket Proxy*): - 1. Daemon host: nextcloud-appapi-dsp:2375 - 2. HTTPS checkbox: ``disabled`` - 3. Network: `user defined network `_ - 4. HaProxy password: **should not be empty** - -.. note:: - Network **should not be the default docker's bridge** as it does not support DNS resolving by container names. - - This means that **Docker Socket Proxy**, **Nextcloud** and **ExApps** containers should all be in the same docker network, different from the default **bridge**. - - .. _nextcloud-in-docker-aio-all-in-one: Nextcloud in Docker AIO (all-in-one) @@ -518,7 +329,7 @@ In the case of AppAPI in Docker AIO setup (installed in Nextcloud container). .. note:: - AIO Docker Socket Proxy container must be enabled. + AIO HaRP container must be enabled. .. mermaid:: @@ -535,13 +346,13 @@ In the case of AppAPI in Docker AIO setup (installed in Nextcloud container). state Containers { [*] --> NextcloudAIOMasterContainer : /var/run/docker.sock - [*] --> DockerSocketProxy : /var/run/docker.sock + [*] --> HaRP : /var/run/docker.sock NextcloudAIOMasterContainer --> Nextcloud AppAPI --> Nextcloud : installed in - Nextcloud --> DockerSocketProxy - DockerSocketProxy --> ExApp1 - DockerSocketProxy --> ExApp2 - DockerSocketProxy --> ExApp3 + Nextcloud --> HaRP + HaRP --> ExApp1 + HaRP --> ExApp2 + HaRP --> ExApp3 } } @@ -552,33 +363,31 @@ In the case of AppAPI in Docker AIO setup (installed in Nextcloud container). class ExApp2 python class ExApp3 python -AppAPI will automatically create the default DaemonConfig for AIO Docker Socket Proxy in order to use it as an orchestrator to create ExApp containers. +AppAPI will automatically create the DaemonConfig for AIO HaRP and set it as the default, +in order to use it as an orchestrator to create ExApp containers. .. note:: - Default DaemonConfig will be created only if the default DaemonConfig is not already registered. + The DaemonConfig is created only if it is not already registered. -Default AIO Deploy Daemon (Docker Socket Proxy) -*********************************************** +Default AIO Deploy Daemon (HaRP) +******************************** -Nextcloud AIO has a specifically created Docker Socket Proxy container to be used as the Deploy Daemon in AppAPI. -It has `fixed parameters `_: +Nextcloud AIO has a specifically created HaRP container to be used as the Deploy Daemon in AppAPI. +It has `fixed parameters `_: -* Name: ``docker_aio`` -* Display name: ``AIO Docker Socket Proxy`` +* Name: ``harp_aio`` +* Display name: ``AIO HaRP`` * Accepts Deploy ID: ``docker-install`` * Protocol: ``http`` -* Host: ``nextcloud-aio-docker-socket-proxy:2375`` +* Host: ``nextcloud-aio-harp:8780`` +* HaRP shared key: ``HP_SHARED_KEY`` of the AIO HaRP container +* FRP tunnel: disabled, HaRP connects to the ExApps directly * Compute device: ``CPU`` * Network: ``nextcloud-aio`` * Nextcloud URL (passed to ExApps): ``https://$NC_DOMAIN`` -Docker Socket Proxy security -**************************** - -AIO Docker Socket Proxy has strictly limited access to the Docker APIs described in `HAProxy configuration `_. - .. _exapp-container-log-rotation: @@ -652,7 +461,6 @@ NC to ExApp Communication ------------------------- Communications between Nextcloud and ExApps are done via the AppAPI. -With Docker Socket Proxy, the requests are sent to the ExApp container directly. For HaRP, the communication goes through the main Nextcloud proxy and the HaRP container. Each type of DeployDaemon necessarily implements the ``resolveExAppUrl`` function. @@ -668,14 +476,14 @@ It has the prototype: where: * **protocol** is daemon protocol value -* **host** is daemon host value, *can be DNS:port or IP:PORT or even path to docker socket*. +* **host** is daemon host value, *can be DNS:port or IP:PORT*. * **port** is an integer with ExApp port * **deployConfig** can be custom for each Daemon type * **auth** is an optional array, with *Basic Authentication* data if needed to access ExApp .. note:: - Applies only to Docker Socket Proxy. + Applies only to daemons without HaRP. The optional additional parameter *OVERRIDE_APP_HOST* can be used to override the host that will be used for ExApp binding. @@ -716,67 +524,5 @@ The simplest implementation is in the **Manual-Install** deploy type: | Here we see that AppAPI sends requests to the **host**:**port** specified during daemon creation for manual-install without HaRP. | But it exclusively uses the ``http(s)://nextcloud.example.tld/exapps/`` route for manual deployments using the HaRP proxy. ``http(s)://nextcloud.example.tld`` is the Nextcloud URL specified in the daemon config. Take care to configure the ``/exapps/`` route in your reverse proxy accordingly if your Nextcloud instance is on a subpath ``https://nextcloud.example.tld/nextcloud``. See `Configuring Your Reverse Proxy `_ in the HaRP readme for examples. -Now, let's take a look at the Docker Daemon implementation of ``resolveExAppUrl``: - -.. code-block:: php - - public function resolveExAppUrl( - string $appId, string $protocol, string $host, array $deployConfig, int $port, array &$auth - ): string { - if (boolval($deployConfig['harp'] ?? false)) { - $url = rtrim($deployConfig['nextcloud_url'], '/'); - if (str_ends_with($url, '/index.php')) { - $url = substr($url, 0, -10); - } - return sprintf('%s/exapps/%s', $url, $appId); - } - - $auth = []; - if (isset($deployConfig['additional_options']['OVERRIDE_APP_HOST']) && - $deployConfig['additional_options']['OVERRIDE_APP_HOST'] !== '' - ) { - $wideNetworkAddresses = ['0.0.0.0', '127.0.0.1', '::', '::1']; - if (!in_array($deployConfig['additional_options']['OVERRIDE_APP_HOST'], $wideNetworkAddresses)) { - return sprintf( - '%s://%s:%s', $protocol, $deployConfig['additional_options']['OVERRIDE_APP_HOST'], $port - ); - } - } - $host = explode(':', $host)[0]; - if ($protocol == 'https') { - $exAppHost = $host; - } elseif (isset($deployConfig['net']) && $deployConfig['net'] === 'host') { - $exAppHost = 'localhost'; - } else { - $exAppHost = $appId; - } - if ($protocol == 'https' && isset($deployConfig['haproxy_password']) && $deployConfig['haproxy_password'] !== '') { - // we only set haproxy auth for remote installations, when all requests come through HaProxy. - $haproxyPass = $this->crypto->decrypt($deployConfig['haproxy_password']); - $auth = [self::APP_API_HAPROXY_USER, $haproxyPass]; - } - return sprintf('%s://%s:%s', $protocol, $exAppHost, $port); - } - -The route for HaRP setups remain the same here as in the previous example. All the requests are sent to the Nextcloud URL with the ``/exapps/`` route. - -For Docker Socket Proxy, however, we have much more complex algorithm of detecting to where requests should be send. - -First of all, if the protocol is set to ``https``, AppAPI always sends requests to the daemon host, -and in this case, it is a HaProxy that will forward requests to ExApps that will be listening on ``localhost``. - -Briefly, it will look like this (*haproxy_host==daemon host value*): - -NC --> *https* --> ``haproxy_host:ex_app_port`` --> *http* --> ``localhost:ex_app_port`` - -When the protocol is not ``https`` but ``http``, then what will be the endpoint where to send requests is determined by ``$deployConfig['net']`` value. - -If ``net`` is defined and equal to ``host``, then AppAPI assumes that ExApp is installed somewhere in the current host network and will be available on ``localhost`` loop-back adapter. - -NC --> *http* --> ``localhost:ex_app_port`` - -In all other cases, the ExApp should be available by it's name: e.g. when using docker **custom bridge** network all containers available by DNS. - -NC --> *http* --> ``app_container_name:ex_app_port`` - -These three different types of communication cover most popular configurations. +The Docker and Kubernetes Deploy Daemons use HaRP, so their requests always go to the ``/exapps/`` route of the +Nextcloud URL. diff --git a/admin_manual/exapps_management/ManagingDeployDaemons.rst b/admin_manual/exapps_management/ManagingDeployDaemons.rst index e52b2f7d03a..f851df04d2d 100644 --- a/admin_manual/exapps_management/ManagingDeployDaemons.rst +++ b/admin_manual/exapps_management/ManagingDeployDaemons.rst @@ -20,15 +20,15 @@ Register Register Deploy Daemon (DaemonConfig). -Command: ``app_api:daemon:register [--net NET] [--haproxy_password HAPROXY_PASSWORD] [--compute_device COMPUTE_DEVICE] [--set-default] [--harp] [--harp_frp_address HARP_FRP_ADDRESS] [--harp_shared_key HARP_SHARED_KEY] [--harp_docker_socket_port HARP_DOCKER_SOCKET_PORT] [--harp_exapp_direct] [--] `` +Command: ``app_api:daemon:register [--net NET] [--compute_device COMPUTE_DEVICE] [--set-default] [--harp] [--harp_frp_address HARP_FRP_ADDRESS] [--harp_shared_key HARP_SHARED_KEY] [--harp_docker_socket_port HARP_DOCKER_SOCKET_PORT] [--harp_exapp_direct] [--] `` Arguments ********* -* ``name`` - unique name of the daemon (e.g. ``docker_local_sock``) +* ``name`` - unique name of the daemon (e.g. ``harp_proxy_host``) * ``display-name`` - name of the daemon (e.g. ``My Local Docker``, will be displayed in the UI) -* ``accepts-deploy-id`` - type of deployment (``docker-install`` or ``manual-install``) -* ``host`` - **path to docker-socket** or the Docker Socket Proxy: ``address:port`` +* ``accepts-deploy-id`` - type of deployment (``docker-install`` or ``manual-install``), ``docker-install`` requires ``--harp`` +* ``host`` - ``address:port`` of HaRP, or the host of the ExApps for ``manual-install`` without HaRP * ``protocol`` - protocol used to communicate with the Daemon/ExApps (``http`` or ``https``) * ``nextcloud_url`` - Nextcloud URL, Daemon config required option (e.g. ``https://nextcloud.local``) @@ -36,10 +36,9 @@ Options ******* * ``--net [network-name]`` - ``[required]`` network name to bind docker container to (default: ``host``) -* ``--haproxy_password HAPROXY_PASSWORD`` - ``[optional]`` password for AppAPI Docker Socket Proxy * ``--compute_device GPU`` - ``[optional]`` GPU device to expose to the daemon (e.g. ``cpu|cuda|rocm``, default: ``cpu``) * ``--set-default`` - ``[optional]`` set created daemon as default for ExApps installation -* ``--harp`` - ``[optional]`` Flag to set daemon to use HaRP for all docker and exapp communication +* ``--harp`` - ``[optional]`` Flag to set daemon to use HaRP for all docker and exapp communication, required for ``docker-install`` * ``--harp_frp_address`` - ``[optional]`` [host]:[port] of the HaRP FRP server, default host is same as HaRP host and port is 8782 * ``--harp_shared_key`` - ``[optional]`` HaRP shared key for secure communication between HaRP and AppAPI. It must match ``HP_SHARED_KEY`` of the HaRP container. The ``some_very_secure_password`` value in the examples below is only @@ -72,30 +71,12 @@ Usage Examples app_api:daemon:register manual_install_harp "Harp Manual Install" "manual-install" "http" "appapi-harp:8780" "http://nextcloud.local" --net nextcloud --harp --harp_frp_address "appapi-harp:8782" --harp_shared_key "some_very_secure_password" -* Register a Docker Socket Proxy deploy daemon with the ``nextcloud-appapi-dsp:2375`` as the host and the ``nextcloud`` docker network. This can be paired with a Docker Socket Proxy container running in the same network with the default port ``2375``. - - .. code-block:: bash - - app_api:daemon:register docker_install "Docker Socket Proxy" "docker-install" "http" "nextcloud-appapi-dsp:2375" "http://nextcloud.local" --net=nextcloud --set-default --compute_device=cuda - * Register a manual deploy daemon with ``host.docker.internal`` as the host used to connect to the ExApps. .. code-block:: bash app_api:daemon:register manual_install "Manual Install" "manual-install" "http" null "http://nextcloud.local" -* Register a local docker deploy daemon with the ``/var/run/docker.sock`` as the socket and the host, and the ``nextcloud`` docker network. This does not need a Docker Socket Proxy container. The compute device used by this daemon is ``CPU``. - - .. code-block:: bash - - app_api:daemon:register local_docker "Docker Local" "docker-install" "http" "/var/run/docker.sock" "http://nextcloud.local" --net=nextcloud - -* Register a local docker deploy daemon with the ``/var/run/docker.sock`` as the socket and the host, and the ``nextcloud`` docker network. This does not need a Docker Socket Proxy container. The compute device used by this daemon is ``CUDA`` (NVIDIA). - - .. code-block:: bash - - app_api:daemon:register local_docker "Docker Local" "docker-install" "http" "/var/run/docker.sock" "http://nextcloud.local" --net=nextcloud --set-default --compute_device=cuda - .. _deploy_config: @@ -134,7 +115,7 @@ DeployConfig options * ``net`` **[required]** - network name to bind docker container to (default: ``host``) * ``nextcloud_url`` **[required]** - Nextcloud URL (e.g. ``https://nextcloud.local``) - * ``haproxy_password`` *[optional]* - password for AppAPI Docker Socket Proxy + * ``haproxy_password`` *[optional]* - HaRP shared key, required for HaRP daemons * ``computeDevice`` *[optional]* - Compute device to attach to the daemon (e.g. ``{ "id": "cuda", "label": "CUDA (NVIDIA)" }``) * ``harp`` *[optional]* - HaRP options, can be ``null`` in case of non-HaRP setups * ``frp_address`` *[optional]* - [host]:[port] of the HaRP FRP server, default host is same as HaRP host and port is 8782 @@ -295,7 +276,7 @@ Add a Docker registry mapping to a Deploy Daemon. Command: ``app_api:daemon:registry:add [--registry-from REGISTRY-FROM] [--registry-to REGISTRY-TO] [--] `` -* ``name`` - name of the Deploy Daemon the mapping is added to (e.g. ``docker_install``) +* ``name`` - name of the Deploy Daemon the mapping is added to (e.g. ``harp_proxy_host``) * ``--registry-from`` - ``[required]`` registry declared by the ExApp (e.g. ``ghcr.io``) * ``--registry-to`` - ``[required]`` registry to use instead, or ``local`` to skip the image pull @@ -306,13 +287,13 @@ if both registries are the same. .. code-block:: bash - sudo -E -u www-data php occ app_api:daemon:registry:add docker_install --registry-from "ghcr.io" --registry-to "registry.example.com" + sudo -E -u www-data php occ app_api:daemon:registry:add harp_proxy_host --registry-from "ghcr.io" --registry-to "registry.example.com" * Use images that are already present on the Docker host instead of pulling them from ``ghcr.io``: .. code-block:: bash - sudo -E -u www-data php occ app_api:daemon:registry:add docker_install --registry-from "ghcr.io" --registry-to "local" + sudo -E -u www-data php occ app_api:daemon:registry:add harp_proxy_host --registry-from "ghcr.io" --registry-to "local" Remove a registry mapping ------------------------- @@ -322,13 +303,13 @@ pair is removed. Command: ``app_api:daemon:registry:remove [--registry-from REGISTRY-FROM] [--registry-to REGISTRY-TO] [--] `` -* ``name`` - name of the Deploy Daemon the mapping is removed from (e.g. ``docker_install``) +* ``name`` - name of the Deploy Daemon the mapping is removed from (e.g. ``harp_proxy_host``) * ``--registry-from`` - ``[required]`` source registry of the mapping to remove * ``--registry-to`` - ``[required]`` target registry of the mapping to remove .. code-block:: bash - sudo -E -u www-data php occ app_api:daemon:registry:remove docker_install --registry-from "ghcr.io" --registry-to "registry.example.com" + sudo -E -u www-data php occ app_api:daemon:registry:remove harp_proxy_host --registry-from "ghcr.io" --registry-to "registry.example.com" List registry mappings ---------------------- @@ -337,17 +318,17 @@ List the Docker registry mappings configured for a Deploy Daemon. Command: ``app_api:daemon:registry:list `` -* ``name`` - name of the Deploy Daemon to list the mappings of (e.g. ``docker_install``) +* ``name`` - name of the Deploy Daemon to list the mappings of (e.g. ``harp_proxy_host``) .. code-block:: bash - sudo -E -u www-data php occ app_api:daemon:registry:list docker_install + sudo -E -u www-data php occ app_api:daemon:registry:list harp_proxy_host The mappings are printed as ``from -> to`` pairs: .. code-block:: text - Configured registries for daemon "docker_install": + Configured registries for daemon "harp_proxy_host": - ghcr.io -> registry.example.com - docker.io -> local diff --git a/admin_manual/exapps_management/ManagingExApps.rst b/admin_manual/exapps_management/ManagingExApps.rst index 10eaffa649b..667420d7550 100644 --- a/admin_manual/exapps_management/ManagingExApps.rst +++ b/admin_manual/exapps_management/ManagingExApps.rst @@ -24,7 +24,7 @@ Arguments ********* * ``appid`` - unique name of the ExApp (e.g. ``app_python_skeleton``, must be the same as in deployed container) - * ``daemon-config-name`` - unique name of the daemon (e.g. ``docker_local_sock``) + * ``daemon-config-name`` - unique name of the daemon (e.g. ``harp_proxy_host``) Options ******* diff --git a/admin_manual/exapps_management/TestDeploy.rst b/admin_manual/exapps_management/TestDeploy.rst index fb2b06cedab..607bf399872 100644 --- a/admin_manual/exapps_management/TestDeploy.rst +++ b/admin_manual/exapps_management/TestDeploy.rst @@ -40,7 +40,7 @@ Possible errors: - Image not found (e.g. not public, no image found for your hardware architecture) - Image pull failed (e.g., due to network issues) - Image pull timeout -- Your Docker Socket Proxy/HaRP is not configured correctly and blocks access to this Docker Engine API +- HaRP is not configured correctly and blocks access to this Docker Engine API See ``journalctl -f -u docker.service`` for more details in systemd based systems. @@ -68,9 +68,7 @@ Possible errors: - ExApp failed to start a web server, e.g., if the port is already in use (this should be visible in the container logs) - ExApp heartbeat_count keeps increasing, this may indicate that the ExApp couldn't start properly -- Nextcloud can not reach the ExApp container, e.g., - * due to a network issue or a firewall (this should be visible in the server logs or the firewall logs) - * due to a "http" protocol deploy daemon. In this case, the ExApp's container listens on localhost (127.0.0.1 or ::1) which might not be reachable from the Nextcloud server and you might want to listen on a different IP address. See ``OVERRIDE_APP_HOST`` in :ref:`Additional options ` in the Deploy Daemon form. This issue can be identified using this command: ``lsof -i -P -n | grep LISTEN`` +- Nextcloud can not reach the ExApp container, e.g., due to a network issue or a firewall (this should be visible in the server logs or the firewall logs) - For HaRP, the main Nextcloud proxy might not be configured to redirect requests to the HaRP container correctly. See the `Configuring Your Reverse Proxy `_ section in the HaRP readme. Init diff --git a/admin_manual/exapps_management/img/app_api_3.png b/admin_manual/exapps_management/img/app_api_3.png deleted file mode 100644 index aa01934d360..00000000000 Binary files a/admin_manual/exapps_management/img/app_api_3.png and /dev/null differ diff --git a/developer_manual/exapp_development/DevSetup.rst b/developer_manual/exapp_development/DevSetup.rst index d3570c1263b..e5acc3f6876 100644 --- a/developer_manual/exapp_development/DevSetup.rst +++ b/developer_manual/exapp_development/DevSetup.rst @@ -51,46 +51,15 @@ There are two types of Deploy daemons that can be used for development and testi 1. ``manual_install``: This type of Deploy daemon is running manually in the host machine. This is useful for ExApp development as you can run your ExApp directly on the host. -2. ``docker_install``: This type of Deploy daemon is running in a Docker container. +2. ``docker_install``: This type of Deploy daemon deploys ExApps as Docker containers through HaRP. You can register (create) these daemons in the AppAPI admin settings. For the equivalent ``occ`` command or an explanation of the Deploy daemon parameters, see :ref:`occ_daemon_config_registration`. -Docker Socket Proxy -******************* +HaRP +**** -For development and testing locally, -the simplest way is to use the `Nextcloud AppAPI DSP HTTP `_. - -In Place of a Conclusion -"""""""""""""""""""""""" - -There are several make commands available to ease frequent development actions. - -To see the complete list, execute ``make help``. - -Docker remote API -***************** - -The Docker Engine remote API can be easily configured via ``make dock2port`` command. -The command will create a docker container to provide remote Docker Engine API. - -Afterward, register DaemonConfigs in Nextcloud using ``make dock-port`` command. - -Docker by socket -**************** - -For Docker via socket, use the command ``make dock-sock``. -This registers DaemonConfigs in Nextcloud for the default socket connection (``/var/run/docker.sock``). - -Make sure that socket has enough permissions for Nextcloud and webserver user to access it -and actually forwarded to the container: - -.. code-block:: - - ... - volumes: - ... - - /var/run/docker.sock:/var/run/docker.sock - ... +For development and testing in Docker, register a ``docker-install`` deploy daemon with +`HaRP `_, see +`Setup deploy daemon `_. diff --git a/developer_manual/exapp_development/development_overview/ExAppDevelopmentSteps.rst b/developer_manual/exapp_development/development_overview/ExAppDevelopmentSteps.rst index 1cbc18e26ba..3b6e4bdc634 100644 --- a/developer_manual/exapp_development/development_overview/ExAppDevelopmentSteps.rst +++ b/developer_manual/exapp_development/development_overview/ExAppDevelopmentSteps.rst @@ -120,4 +120,4 @@ It's the same as for the regular Nextcloud app, but with the requirement of :ref It is important to ensure that your ExApp works as expected. We recommend having different types of dev setup configurations to test all of them. While the main development is done locally via ``manual_install``, you must also ensure that -the ExApp works correctly in a Docker container with Docker Socket Proxy (HTTP and HTTPS). +the ExApp works correctly in a Docker container with HaRP. diff --git a/developer_manual/exapp_development/development_overview/ExAppHarpIntegration.rst b/developer_manual/exapp_development/development_overview/ExAppHarpIntegration.rst index 7ed2c4e0b16..952ee6e94ee 100644 --- a/developer_manual/exapp_development/development_overview/ExAppHarpIntegration.rst +++ b/developer_manual/exapp_development/development_overview/ExAppHarpIntegration.rst @@ -17,8 +17,7 @@ HaRP is a reverse proxy system designed to simplify the deployment workflow for Nextcloud 32’s AppAPI. It enables direct communication between clients and ExApps, bypassing -the Nextcloud instance to improve performance and reduce the complexity -traditionally associated with `DockerSocketProxy` setups. +the Nextcloud instance to improve performance. HaRP provides an `FRP-based `_ transport for ExApps and recommends copying @@ -28,12 +27,7 @@ The script installs or starts the FRP client and executes your app process. .. warning:: - We strongly recommend starting support for HaRP in ExApps from the start - of Nextcloud 32, as the old `DSP `_ - way will be deprecated and marked for removal in Nextcloud 35. - - Adding HaRP support is fully compatible with the existing DSP system, - so you won’t need to maintain two separate release types of your ExApp. + AppAPI deploys ExApps to Docker only through HaRP, so your ExApp needs HaRP support. Key integration considerations ------------------------------ diff --git a/developer_manual/exapp_development/faq/BehindCompanyProxy.rst b/developer_manual/exapp_development/faq/BehindCompanyProxy.rst index 30f3a121b29..34f94273ab8 100644 --- a/developer_manual/exapp_development/faq/BehindCompanyProxy.rst +++ b/developer_manual/exapp_development/faq/BehindCompanyProxy.rst @@ -12,7 +12,7 @@ When running the command: .. code-block:: bash - sudo -E -u www-data php occ app_api:app:register test-deploy docker_socket_proxy --info-xml https://raw.githubusercontent.com/nextcloud/test-deploy/main/appinfo/info.xml --test-deploy-mode --no-ansi --no-warnings + sudo -E -u www-data php occ app_api:app:register test-deploy harp_proxy_host --info-xml https://raw.githubusercontent.com/nextcloud/test-deploy/main/appinfo/info.xml --test-deploy-mode --no-ansi --no-warnings You may receive an error similar to: @@ -136,7 +136,7 @@ Method 2: Set System-Wide Environment Variables .. code-block:: bash - sudo -E -u www-data php occ app_api:app:register test-deploy docker_socket_proxy --info-xml https://raw.githubusercontent.com/nextcloud/test-deploy/main/appinfo/info.xml --test-deploy-mode --no-ansi --no-warnings + sudo -E -u www-data php occ app_api:app:register test-deploy harp_proxy_host --info-xml https://raw.githubusercontent.com/nextcloud/test-deploy/main/appinfo/info.xml --test-deploy-mode --no-ansi --no-warnings It should now work without connectivity issues. diff --git a/developer_manual/exapp_development/faq/DockerSocketProxy.rst b/developer_manual/exapp_development/faq/DockerSocketProxy.rst index 9489121b9bb..31d7dceabff 100644 --- a/developer_manual/exapp_development/faq/DockerSocketProxy.rst +++ b/developer_manual/exapp_development/faq/DockerSocketProxy.rst @@ -1,56 +1,11 @@ Docker Socket Proxy =================== -The recommended way to setup the AppAPI Deploy daemon -is to use our `Docker Socket Proxy implementation `_. - -Nextcloud AppAPI DSP --------------------- - -Nextcloud AppAPI DSP (Docker Socket Proxy) is a simple Docker container that provides a secure way to access the Docker Engine API and ExApps. -It is secured with haproxy Basic authentication. -There are two parts of reverse proxy configuration: - -- HaProxy config for `Docker Engine API `_ -- HaProxy config for `ExApps `_ - -.. note:: - - For remote Docker Socket Proxy setup, it should expose the ports on the host. - - -.. _faq_nextcloud-aio-docker-socket-proxy: - -Nextcloud AIO -------------- - -Nextcloud AIO implements its own `Docker Socket Proxy container `_; -you just need to tick the checkbox in the AIO configuration interface to enable it. -AppAPI automatically creates the default Deploy daemon configuration for Nextcloud AIO. - -See `Nextcloud in Docker AIO (all-in-one) `_ for more details. - -.. note:: - - Nextcloud AIO is not limited to its default Deploy daemon. - You can setup any other Deploy daemon (local or remote) for use in AppAPI. - - -Other implementations ---------------------- - -Our implementation is inspired by `Tecnativa Docker Socket Proxy `_. -By default, it restricts access to the required by AppAPI Docker Engine APIs. -In this case, you will have to enable these APIs via the environment variables: - -- ``IMAGES=1`` -- ``CONTAINER=1`` -- ``POST=1`` - -.. note:: - - For local Deploy daemon setup, other implementations of Docker Socket Proxy may be enough. - But for remote Deploy daemon setup, we recommend using our DSP, - as `we allow `_ only the Docker Engine APIs we actually use in AppAPI, - and it is additionally secured with haproxy authentication. - +AppAPI no longer supports Docker Socket Proxy (DSP) deploy daemons. +Docker deploy daemons use `HaRP `_, +see :doc:`../development_overview/ExAppHarpIntegration`. + +ExApps already installed on a DSP daemon keep running, but AppAPI no longer manages them. +To move them to HaRP, see +`Moving ExApps from Docker Socket Proxy to HaRP `_ +in the administration guide. diff --git a/developer_manual/exapp_development/faq/Troubleshooting.rst b/developer_manual/exapp_development/faq/Troubleshooting.rst index 01188a532e5..af46d070841 100644 --- a/developer_manual/exapp_development/faq/Troubleshooting.rst +++ b/developer_manual/exapp_development/faq/Troubleshooting.rst @@ -33,7 +33,7 @@ Generally speaking, there are three steps to find the proper error message to un 1. Check Nextcloud logs 2. Check ExApp container logs (available only if ExApp container is created and/or running) 3. Check Deploy daemon host logs (``journalctl -u docker.service``) -4. Check Docker Socket Proxy logs (if used, and if needed, e.g. for SSL or 401 errors check) +4. Check HaRP container logs (``docker logs appapi-harp``) Failed to create volume diff --git a/developer_manual/exapp_development/tech_details/Deployment.rst b/developer_manual/exapp_development/tech_details/Deployment.rst index a61b672d60b..13d1ba74c85 100644 --- a/developer_manual/exapp_development/tech_details/Deployment.rst +++ b/developer_manual/exapp_development/tech_details/Deployment.rst @@ -17,36 +17,38 @@ DaemonConfig registration ------------------------- The first step is to register the DaemonConfig, where your ExApps will be deployed. -Before that, you will need to configure your Docker socket to be accessible by the Nextcloud instance and webserver user. -If you use the remote Docker Engine API, you will need to expose it so that it is accessible by the Nextcloud instance and import certificates. +Before that, you will need to set up `HaRP `_ with access to the Docker Engine. .. note:: - For now, only the Docker daemon ``accepts-deploy-id: docker-install`` is supported. + The Docker daemon ``accepts-deploy-id: docker-install`` requires HaRP (``--harp``). For development and manually deployed apps in Docker, there is ``accepts-deploy-id: manual-install``. This can be done by the ``occ`` **app_api:daemon:register** command: .. code-block:: bash - app_api:daemon:register [--net NET] [--haproxy_password PASSWORD] [--compute_device DEVICE] [--set-default] [--] + app_api:daemon:register [--net NET] [--compute_device DEVICE] [--set-default] [--harp] [--harp_frp_address ADDRESS] [--harp_shared_key KEY] [--] Arguments ********* - * ``name`` - unique name of the daemon (e.g. ``docker_local_sock``) + * ``name`` - unique name of the daemon (e.g. ``harp_proxy_host``) * ``display-name`` - name of the daemon (e.g. ``My Local Docker``, will be displayed in the UI) * ``accepts-deploy-id`` - type of deployment (``docker-install`` or ``manual-install``) * ``protocol`` - protocol used to connect to the daemon (``http`` or ``https``) - * ``host`` - host of the daemon (e.g. ``/var/run/docker.sock`` or ``host:port``) + * ``host`` - host and port of HaRP (e.g. ``appapi-harp:8780``), or the ExApp host for ``manual-install`` + without HaRP * ``nextcloud_url`` - Nextcloud URL, Daemon config required option (e.g. ``https://nextcloud.local``) Options ******* * ``--net [network-name]`` - ``[required]`` network name to bind docker container to (default: ``host``) - * ``--haproxy_password PASSWORD`` - ``[optional]`` password for HAProxy Basic auth if ``AppAPI Docker Socket Proxy`` is used * ``--compute_device DEVICE`` - ``[optional]`` GPU device to expose to the daemon (defaults to ``cpu``, but ``cuda`` and ``rocm`` are also supported) * ``--set-default`` - ``[optional]`` sets the newly created daemon as the default + * ``--harp`` - ``[optional]`` use HaRP for all Docker and ExApp communication, required for ``docker-install`` + * ``--harp_frp_address ADDRESS`` - ``[optional]`` ``host:port`` of the HaRP FRP server + * ``--harp_shared_key KEY`` - ``[optional]`` HaRP shared key, must match ``HP_SHARED_KEY`` of the HaRP container .. note:: Common configurations are tested by the CI in our repository, see `workflows on GitHub `_. @@ -58,7 +60,7 @@ Example of ``occ`` **app_api:daemon:register** command: .. code-block:: bash - sudo -E -u www-data php occ app_api:daemon:register docker_local_sock "My Local Docker" docker-install http /var/run/docker.sock "https://nextcloud.local" --net nextcloud + sudo -E -u www-data php occ app_api:daemon:register harp_proxy_host "Harp Proxy (Host)" docker-install http localhost:8780 "https://nextcloud.local" --harp --harp_frp_address localhost:8782 --harp_shared_key "some_very_secure_password" ExApp registration @@ -75,7 +77,7 @@ Arguments ********* * ``appid`` - unique name of the ExApp (e.g. ``app_python_skeleton``, must be the same as in deployed container) - * ``daemon-config-name`` - unique name of the daemon (e.g. ``docker_local_sock``) + * ``daemon-config-name`` - unique name of the daemon (e.g. ``harp_proxy_host``) Options *******