# Pangolin

Pangolin is a self-hosted tunneled reverse proxy server with identity and access control, designed to securely expose private resources on distributed networks. Acting as a central hub, it connects isolated networks — even those behind restrictive firewalls — through encrypted tunnels, enabling easy access to remote services without opening ports.

### References

<ReferenceLinks references={frontmatter.references} />

---

## Directory structure

- pangolin
  - config
    - config.yml (\*)
    - db
      - db.sqlite
    - key
    - letsencrypt
      - acme.json
    - logs/
    - traefik
      - traefik_config.yml (\*)
      - dynamic_config.yml (\*)
  - compose.yml (\*)

## Make directory

```sh wrap preserveIndent
mkdir -p {{DOCKER_PATH_VAR}}/pangolin/config {{DOCKER_PATH_VAR}}/pangolin/traefik && cd {{DOCKER_PATH_VAR}}/pangolin
```

## compose.yml

```sh
nano compose.yml
```

```yml title="compose.yml"
dockerCompose
```

## config.yml

```sh
nano ./config/config.yml
```

```yml title="./config/config.yml"
configYml
```

## traefik_config.yml

```sh
nano ./traefik/traefik_config.yml
```

```yml title="./traefik/traefik_config.yml"
traefikConfigYml
```

## dynamic_config.yml

```sh
nano ./traefik/dynamic_config.yml
```

```yml title="./traefik/dynamic_config.yml"
dynamicConfigYml
```

## Cloudflare DNS API token

**Caution:** Make sure your API token has the permissions Zone/Zone/Read and Zone/DNS/Edit and make sure it
  applies to all zones.

## .env

```sh
nano .env
```

```dotenv title=".env"
env
```

## Start container

```sh
docker compose up -d
```

## Open web ui

<OpenWebUI port="3001" />
