diff --git a/README.md b/README.md
index a175e327491f60342cd2386d43b6ab4ae204d9e7..844346cf0f7f527bd051e7e366db63d137dbdc73 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,7 @@
   - [Test](#test)
   - [Contribute](#contribute)
   - [Structure](#project-structure)
+- [docker](./docker/) docker-related documentation
 - [docs](./docs/)
   - [api](./docs/api/)
     - [manual](./docs/api/manual.md)
@@ -34,7 +35,7 @@
   - [user](./docs/user/)
     - [autocompletion](./docs/user/autocompletion.md)
     - [build-for-arm](./docs/user/build-for-arm.md)
-    - [rpc](./docs/user/rpc.md) deploy a permanent ǦDev mirror node
+    - [mirror](./docs/user/mirror.md) deploy a permanent ǦDev mirror node
     - [smith](./docs/user/smith.md) deploy a permanent ǦDev validator node
 - [end2end-tests](./end2end-tests/) automated end to end tests written with cucumber
 - [live-tests](./live-tests/) sanity checks to test the storage of a live chain
diff --git a/docker/README.md b/docker/README.md
index e93db2e0f64c888041ce7596d67394ff067e74fa..c9f30b43ea6819cf34f846ca5580426484042012 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -4,13 +4,13 @@ Duniter is the software that supports the [Ğ1 libre-currency blockchain](https:
 
 [Duniter v2s](https://git.duniter.org/nodes/rust/duniter-v2s) is a complete rewrite of Duniter based on the Substrate / Polkadot framework. **This is alpha state work in progress.**
 
-# Minimal docker-compose file for an RPC (non validator) node
+## Minimal docker-compose file for an mirror node
 
 ```
 version: "3.5"
 
 services:
-  duniter-rpc:
+  duniter-mirror:
     image: duniter/duniter-v2s:latest
     restart: unless-stopped
     ports:
@@ -23,16 +23,16 @@ services:
       # p2p
       - 30333:30333
     volumes:
-      - data-rpc:/var/lib/duniter/
+      - data-mirror:/var/lib/duniter/
     environment:
       - DUNITER_CHAIN_NAME=gdev
       - DUNITER_NODE_NAME=<my-node-name>
 
 volumes:
-  data-rpc:
+  data-mirror:
 ```
 
-# Minimal docker-compose file for a validator node
+## Minimal docker-compose file for a validator node
 
 ```
 version: "3.5"
@@ -57,26 +57,34 @@ volumes:
   data-validator:
 ```
 
-# Environment variables
+## Environment variables
 
 | Name | Description | Default |
 | ---- | ----------- | ------- |
 | `DUNITER_NODE_NAME` | The node name. This name will appear on the Substrate telemetry server when telemetry is enabled. | Random name |
 | `DUNITER_CHAIN_NAME` | The currency to process. "gdev" uses the embeded chainspec. A path allows to use a local json raw chainspec. | `dev` (development mode) |
-| `DUNITER_PUBLIC_ADDR` | The libp2p public address base. See [libp2p documentation](https://docs.libp2p.io/concepts/fundamentals/addressing/). This variable is useful when the node is behind a reverse-proxy with its ports not directly exposed.<br>Note: the `p2p/<peer_id>` part of the address shouldn't be set in this variable. It is automatically added by Duniter. | duniter-v2s guesses one from the node's IPv4 address. |
+| `DUNITER_PUBLIC_ADDR` | The libp2p public address base. See [libp2p documentation](https://docs.libp2p.io/concepts/fundamentals/addressing/). This variable is useful when the node is behind a reverse proxy with its ports not directly exposed.<br>Note: the `p2p/<peer_id>` part of the address shouldn't be set in this variable. It is automatically added by Duniter. | duniter-v2s guesses one from the node's IPv4 address. |
 | `DUNITER_LISTEN_ADDR` | The libp2p listen address. See [libp2p documentation](https://docs.libp2p.io/concepts/fundamentals/addressing/). This variable is useful when running a validator node behind a reverse proxy, to force the P2P end point in websocket mode with:<br>  `DUNITER_LISTEN_ADDR=/ip4/0.0.0.0/tcp/30333/ws` | Non validator node: `/ip4/0.0.0.0/tcp/30333/ws`<br>Validator node: `/ip4/0.0.0.0/tcp/30333` |
 | `DUNITER_RPC_CORS` | Value of the polkadot `--rpc-cors` option. | `all` |
 | `DUNITER_VALIDATOR` | Boolean (`true` / `false`) to run the node in validator mode. Configure the polkadot options `--validator --rpc-methods Unsafe`. | `false` |
 | `DUNITER_DISABLE_PROMETHEUS` | Boolean to disable the Prometheus endpoint on port 9615. | `false` |
-| `DUNITER_DISABLE_TELEMETRY` | Boolean to disable connecting to the Substrate tememetry server. | `false` |
+| `DUNITER_DISABLE_TELEMETRY` | Boolean to disable connecting to the Substrate telemetry server. | `false` |
 | `DUNITER_PRUNING_PROFILE` | * `default`<br> * `archive`: keep all blocks and state blocks<br> * `light`: keep only last 256 state blocks and last 14400 blocks (one day duration) | `default` |
 
-# Other duniter options
+## Other Duniter options
 
-You can pass any other option to duniter using the `command` docker-compose element:
+You can pass any other option to Duniter using the `command` docker-compose element:
 ```
     command:
       # workaround for substrate issue #12073
       # https://github.com/paritytech/substrate/issues/12073
       - "--wasm-execution=interpreted-i-know-what-i-do"
 ```
+
+## Start Duniter
+
+Once you are happy with your `docker-compose.yml` file, run in the same folder:
+
+```bash
+docker compose up -d
+```
\ No newline at end of file
diff --git a/docker/compose/gdev-mirror.docker-compose.yml b/docker/compose/gdev-mirror.docker-compose.yml
deleted file mode 100644
index 039ab56b7d51fe7513101ada257a7c65b42ba2a9..0000000000000000000000000000000000000000
--- a/docker/compose/gdev-mirror.docker-compose.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-# This is a docker template for running a gdev mirror
-
-version: "3.5"
-
-services:
-  duniter-rpc:
-    image: duniter/duniter-v2s:latest
-    restart: unless-stopped
-    ports:
-      # telemetry
-      - 127.0.0.1:9615:9615
-      # rpc
-      - 127.0.0.1:9933:9933
-      # rpc-ws
-      - 127.0.0.1:9944:9944
-      # p2p
-      - 30333:30333
-    volumes:
-      - ./node.key:/etc/duniter/node.key
-      - duniter-rpc-data:/var/lib/duniter/
-    environment:
-      - DUNITER_CHAIN_NAME=gdev
-      # SERVER_DOMAIN should be replaced by a domain name that point on your server
-      - DUNITER_PUBLIC_ADDR=/dns/${SERVER_DOMAIN?SERVER_DOMAIN should be set}/tcp/30333/ws
-
-volumes:
-  duniter-rpc-data:
diff --git a/docker/compose/gdev-validator.docker-compose.yml b/docker/compose/gdev-validator.docker-compose.yml
deleted file mode 100644
index 655dd1a209be43b04b7fe132bb2df10a00b517ae..0000000000000000000000000000000000000000
--- a/docker/compose/gdev-validator.docker-compose.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-version: "3.5"
-
-services:
-  duniter-rpc:
-    image: duniter/duniter-v2s:latest
-    restart: unless-stopped
-    ports:
-      # telemetry
-      - 127.0.0.1:9615:9615
-      # rpc
-      - 127.0.0.1:9933:9933
-      # rpc-ws
-      - 127.0.0.1:9944:9944
-      # p2p
-      - 30333:30333
-    volumes:
-      - ./node.key:/etc/duniter/validator-node.key
-      - duniter-rpc-data:/var/lib/duniter/
-    environment:
-      - DUNITER_CHAIN_NAME=gdev
-      # RPC_SERVER_DOMAIN should be replaced by a domain name that point on your server
-      - DUNITER_PUBLIC_ADDR=/dns/${RPC_SERVER_DOMAIN?RPC_SERVER_DOMAIN should be set}/tcp/30333/ws
-
-  duniter-validator:
-    image: duniter/duniter-v2s:latest
-    restart: unless-stopped
-    ports:
-      # telemetry
-      - 127.0.0.1:9616:9615
-      # rpc
-      - 127.0.0.1:9934:9933
-      # rpc-ws
-      - 127.0.0.1:9945:9944
-      # p2p
-      - 30334:30333
-    volumes:
-      - ./node.key:/etc/duniter/validator-node.key
-      - duniter-validator-data:/var/lib/duniter/
-    environment:
-      - DUNITER_CHAIN_NAME=gdev
-      # VALIDATOR_SERVER_DOMAIN should be replaced by a domain name that point on your server
-      - DUNITER_PUBLIC_ADDR=/dns/${VALIDATOR_SERVER_DOMAIN?VALIDATOR_SERVER_DOMAIN should be set}/tcp/30333
-      - DUNITER_VALIDATOR=true
-    command:
-      - "--pruning=14400"
diff --git a/docker/compose/live-template.docker-compose.yml b/docker/compose/live-template.docker-compose.yml
index 643ae8c4ea970ba5a13a9a4e4cc1b3d8cf80e9f8..8c2aba285224ba0aacfe1919deb46475bde044ea 100644
--- a/docker/compose/live-template.docker-compose.yml
+++ b/docker/compose/live-template.docker-compose.yml
@@ -1,3 +1,5 @@
+# this template is used in /scripts/create-live-network.sh script
+
 version: "3.5"
 
 services:
diff --git a/docs/user/mirror.md b/docs/user/mirror.md
new file mode 100644
index 0000000000000000000000000000000000000000..4777bfd8bdde4e31b5ba99950bbd9fa4cd301efd
--- /dev/null
+++ b/docs/user/mirror.md
@@ -0,0 +1,21 @@
+# How to deploy a permanent rpc node on ĞDev network
+
+## Publish a node
+
+### Duniter part
+
+See [docker documentation](../../docker/README.md) to install, configure, and start a node.
+
+### Reverse proxy part
+
+See [nginx reverse proxy](./nginx_reverse_proxy.md).
+
+To go further, read [How to become a (black)smith](./smith.md)
+
+## Upgrade your node with minimal interruption
+
+1. Modify docker image tag on your compose file
+2. Run `docker compose pull`, this will pull the new image.
+3. Run `docker compose up -d --remove-orphans`, this will recreate the container
+4. Verify that your node restarted well `docker compose logs duniter-rpc`
+5. Remove the old image `docker rmi duniter/duniter-v2s:OLD_TAG`
diff --git a/docs/user/rpc.md b/docs/user/nginx_reverse_proxy.md
similarity index 57%
rename from docs/user/rpc.md
rename to docs/user/nginx_reverse_proxy.md
index cf43bd114777cc60ef9a53431f7cfc860216bded..b315cea8e312f9f72236ad660bdbab03371fd2e2 100644
--- a/docs/user/rpc.md
+++ b/docs/user/nginx_reverse_proxy.md
@@ -1,21 +1,5 @@
-# How to deploy a permanent rpc node on ĞDev network
 
-## Publish a node
-
-### Duniter part
-
-- Add this docker-compose template on your server:
-  [docker/compose/gdev-rpc.docker-compose.yml](https://git.duniter.org/nodes/rust/duniter-v2s/-/blob/master/docker/compose/gdev-mirror.docker-compose.yml)
-- Rename the file : `mv gdev-mirror.docker-compose.yml docker-compose.yml`
-- In the same folder, create a `.env` file that defime environment variables `SERVER_DOMAIN`:
-
-```bash
-SERVER_DOMAIN=YOUR_DOMAIN
-```
-
-- Do `docker compose up -d` to start your node
-
-### Reverse-proxy part (with Nginx)
+# Nginx reverse proxy example
 
 In `/etc/nginx/sites-enabled/gdev.YOUR_DOMAIN` put (you can probably do simpler):
 
@@ -66,13 +50,3 @@ and replace `YOUR_DOMAIN` by your domain each time.
 - `service nginx reload`
 
 Your node is now online as a rpc node. It's fully capable for wallet use.
-
-To go further, read [How to become a (black)smith](./smith.md)
-
-## Upgrade your node with minimal interruption
-
-1. Modify docker image tag on your compose file
-2. Run `docker compose pull`, this will pull the new image.
-3. Run `docker compose up -d --remove-orphans`, this will recreate the container
-4. Verify that your node restarted well `docker compose logs duniter-rpc`
-5. Remove the old image `docker images rmi duniter/duniter-v2s:OLD_TAG`
diff --git a/docs/user/smith.md b/docs/user/smith.md
index e0fa28c4f31f0f41efbbd5b0dfbb0a56f920c2f4..8209e8bd88df16f14b5da58f4fbae7b6a42f76da 100644
--- a/docs/user/smith.md
+++ b/docs/user/smith.md
@@ -4,67 +4,11 @@
 
 ### Duniter part
 
-- Add this docker-compose on your server :
-  [docker/compose/gdev-validator.docker-compose.yml](https://git.duniter.org/nodes/rust/duniter-v2s/-/blob/master/docker/compose/gdev-validator.docker-compose.yml)
-- Create a `.env` file that define environment variable `SERVER_DOMAIN`:
+See [docker documentation](../../docker/README.md) to install, configure, and start a node. For a smith node, you want to set `DUNITER_VALIDATOR` to `true`.
 
-```bash
-SERVER_DOMAIN=YOUR_DOMAIN
-```
+### Reverse proxy part
 
-- `docker compose up -d` to start your node
-
-### Reverse-proxy part (with Nginx)
-
-In `/etc/nginx/sites-enabled/gdev.YOUR_DOMAIN` put (you can probably do simpler):
-
-```nginx
-server {
-  server_name gdev.YOUR_DOMAIN.fr;
-
-  listen 443 ssl http2;
-  listen [::]:443 ssl http2;
-  ssl_certificate /etc/nginx/ssl/YOUR_DOMAIN.cert;
-  ssl_certificate_key /etc/nginx/ssl/YOUR_DOMAIN.key;
-
-  root /nowhere;
-
-  add_header X-Frame-Options SAMEORIGIN;
-  add_header X-XSS-Protection "1; mode=block";
-  proxy_redirect off;
-  proxy_buffering off;
-  proxy_set_header Host $host;
-  proxy_set_header X-Real-IP $remote_addr;
-  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-  proxy_set_header X-Forwarded-Proto $scheme;
-  proxy_set_header X-Forwarded-Port $server_port;
-  proxy_read_timeout 90;
-
-  location /http {
-    proxy_pass http://localhost:9933;
-    proxy_http_version 1.1;
-  }
-  location /ws {
-    proxy_pass http://localhost:9944;
-
-    proxy_set_header Upgrade $http_upgrade;
-    proxy_set_header Connection "upgrade";
-    proxy_http_version 1.1;
-
-    proxy_read_timeout 1200s;
-    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-    proxy_set_header Host $host;
-  }
-}
-```
-
-and replace `YOUR_DOMAIN` by your domain each time.
-
-- [generate your ssl certificates](https://github.com/acmesh-official/acme.sh) with let's encrypt
-  if you don't already have a wildcard certificate.
-- `service nginx reload`
-
-Your node is now online as a rpc node. It's fully capable for wallet use.
+See [nginx reverse proxy](./nginx_reverse_proxy.md).
 
 ## Join the Smith WoT
 
@@ -84,9 +28,9 @@ When you have at least 3 certifications, your'in!
 - Generate and publish your session keys
   1. create an ssh bridge from your desktop/laptop to your server : `ssh -L 9945:localhost:9945 SSH_USER@YOUR_SERVER`
   2. In your browser go to [polkadotjs : ws://localhost:9945](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2Flocalhost%3A9945#/explorer)
-  3. In the UI : developer > appel RPC > author > rotateKey() and run
-  4. copy the result in clipboard
-  5. In the UI : developer > extrinsics > YOUR_SMITH_ACCOUNT > authorityMembers > setSessionKeys(keys) then copy your session keys and run the query.
+  3. In the UI : developer > appel RPC > author > rotateKey() and copy the result in clipboard
+  4. In the UI : developer > extrinsics > YOUR_SMITH_ACCOUNT > authorityMembers > setSessionKeys(keys) then paste your session keys and run the query.
+  5. In the UI : developer > extrinsics > YOUR_SMITH_ACCOUNT > authorityMembers > claimMembership(keys)
   6. **wait 48h to verify you keep sync**
 - Join
   - In the UI : developer > extrinsics > YOUR_SMITH_ACCOUNT > authorityMembers > goOnline()
@@ -99,4 +43,4 @@ If you're not able to monitor, reboot, act on your node, goOffline() to avoid pe
 2. Run `docker compose pull`, this will pull the new image.
 3. Run `docker compose up -d --remove-orphans`, this will recreate the container
 4. Verify that your node restarted well `docker compose logs duniter-validator`
-5. Remove the old image `docker images rmi duniter/duniter-v2s:OLD_TAG`
+5. Remove the old image `docker rmi duniter/duniter-v2s:OLD_TAG`