<h1>Installation</h1>

<h2>Table of Contents</h2>

- [Introduction](#introduction)
- [Considerations](#considerations)
- [Set Mycelium](#set-mycelium)
- [Start Mycelium](#start-mycelium)
- [Use Mycelium](#use-mycelium)
- [Mycelium Service (optional)](#mycelium-service-optional)

***

## Introduction

In this section, we cover how to install Mycelium. This guide can be done on a local machine and also on a full VM running on the TFGrid. 

Currently, Linux, macOS and Windows are supported. On Windows, you must have `wintun.dll` in the same directory you are executing the binary from.

## Considerations

You might need to run Mycelium as root, enable IPv6 at the OS level and disconnect your VPN.

Read the [Troubleshooting](information.md#troubleshooting) section for more information.

## Set Mycelium

- Update the system
    ```
    apt update
    ```
- Download the latest Mycelium release: [https://github.com/threefoldtech/mycelium/releases/latest](https://github.com/threefoldtech/mycelium/releases/latest)
    ``` 
    wget https://github.com/threefoldtech/mycelium/releases/download/v0.4.0/mycelium-x86_64-unknown-linux-musl.tar.gz
    ```
- Extract Mycelium
    ``` 
    tar -xvf mycelium-x86_64-unknown-linux-musl.tar.gz
    ```
- Move Mycelium to your path
    ``` 
    mv mycelium /usr/local/bin
    ```

## Start Mycelium

You can start Mycelium 

- Start Mycelium
    ``` 
    mycelium --peers tcp://83.231.240.31:9651 quic://185.206.122.71:9651 --tun-name utun2
    ```
- Open another terminal
- Check the Mycelium connection information (address and public key)
    ``` 
    mycelium inspect --json
    ```

## Use Mycelium

Once you've set Mycelium, you can use it to ping other addresses and also to connect into VMs running on the TFGrid.

- Ping the VM from another machine with IPv6
    ``` 
    ping6 mycelium_address
    ```
- SSH into a VM running on the TFGrid
    ```
    ssh root@vm_mycelium_address
    ```

## Mycelium Service (optional)

You can create a systemd service to make sure Mycelium is always enabled and running.

- Create a Mycelium service
    ```bash
    nano /etc/systemd/system/mycelium.service
    ```
- Set the service and save the file
    ```
    [Unit]
    Description=End-2-end encrypted IPv6 overlay network
    Wants=network.target
    After=network.target
    Documentation=https://github.com/threefoldtech/mycelium

    [Service]
    ProtectHome=true
    ProtectSystem=true
    SyslogIdentifier=mycelium
    CapabilityBoundingSet=CAP_NET_ADMIN
    StateDirectory=mycelium
    StateDirectoryMode=0700
    ExecStartPre=+-/sbin/modprobe tun
    ExecStart=/usr/local/bin/mycelium --tun-name mycelium -k %S/mycelium/key.bin --peers tcp://146.185.93.83:9651 quic://83.231.240.31:9651 quic://185.206.122.71:9651 tcp://[2a04:f340:c0:71:28cc:b2ff:fe63:dd1c]:9651 tcp://[2001:728:1000:402:78d3:cdff:fe63:e07e]:9651 quic://[2a10:b600:1:0:ec4:7aff:fe30:8235]:9651
    Restart=always
    RestartSec=5
    TimeoutStopSec=5

    [Install]
    WantedBy=multi-user.target  
    ```
- Enable the service
    ```
    systemctl daemon-reload
    systemctl enable mycelium
    systemctl start mycelium
    ```
- Verify that the Mycelium service is properly running
    ```
    systemctl status mycelium
    ```

Systemd will start up the Mycelium, restart it if it ever crashes, and start it up automatically after any reboots.