---
title: Pingvin
description: Installer Pingvin Share, une plateforme de partage de fichiers auto-hébergée pour envoyer des fichiers en toute sécurité sans passer par WeTransfer ou Google Drive.
---


:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}

[Pingvin](https://github.com/stonith404/pingvin-share) est un outil pour partager rapidement des fichiers, à la manière de WeTransfer. Ses nombreuses options de partage (mot de passe, durée d'expiration, lien personnalisé, etc.) en font l'outil idéal pour partager des fichiers rapidement. Pingvin peut aussi créer des _demandes d'envoi_, c'est-à-dire un lien partageable à envoyer à quelqu'un pour qu'il dépose ses fichiers et que vous les récupériez.

![picture](/img/serveex/pingvin.png)

## Installation

::steps{level="3"}
### Déployer la stack

Ouvrez Dockge, cliquez sur `compose`, nommez la stack `pingvin`, puis copiez-collez ceci :

```yaml [compose.yaml]
---
services:
  pingvin-share:
    container_name: pingvin
    image: stonith404/pingvin-share
    restart: unless-stopped
    ports:
      - 3600:3000
    volumes:
      - /srv/docker/pingvin/data:/opt/app/backend/data
      - /srv/docker/pingvin/data/img:/opt/app/frontend/public/img
      - /srv/docker/pingvin/uploads:/opt/app/backend/uploads # chemin du dossier où stocker les fichiers envoyés à pingvin. À adapter à votre convenance.
    depends_on:
      clamav:
        condition: service_healthy
    networks:
      - swag

  clamav: #antivirus pour les fichiers
    restart: unless-stopped
    image: clamav/clamav
```
::note

À partir d'ici, nous partons du principe que le nom du réseau de Swag est `swag_default`.
::

::tip{icon=""}
✨ __Astuce :__ ajoutez le label watchtower à chaque conteneur pour automatiser les mises à jour.

    ```yaml [compose.yaml]
    services:
      pingvin-share:
        #...
        labels:

          - com.centurylinklabs.watchtower.enable=true

      clamav:
        #...
        labels:

          - com.centurylinklabs.watchtower.enable=true
    ```
::

Déployez le conteneur et allez sur `http://ipdevotreserveur:3600`. Et voilà ! Votre instance web Pingvin est en route !

### Terminé !
::

::caution

__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::

## Exposer Pingvin avec Swag
Tout l'intérêt d'une solution comme celle-ci est de pouvoir y accéder à distance, depuis tous vos appareils. Pour cela, nous allons exposer Pingvin à travers Swag.

::note{icon=""}
📋 __Au préalable :__ <br/><br/>
Nous partons du principe que vous avez le sous-domaine `pingvin.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), que le port `443` de votre box est redirigé vers le port `443` de votre serveur via les [règles NAT](/general/networking/nat).
::

::steps{level="3"}
### Ajouter le réseau de Pingvin à SWAG

Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose pour y ajouter le réseau de pingvin :

```yaml [compose.yaml]
---
services:
  swag:
     container_name: # ...
      # ... 
     networks:             # Rattache le conteneur au réseau personnalisé 
      # ...           
      - pingvin            # Nom du réseau déclaré dans la stack

networks:                  # Définit le réseau personnalisé
  # ...
  pingvin:                 # Nom du réseau déclaré dans la stack
    name: pingvin_default  # Nom réel du réseau externe
    external: true         # Précise qu'il s'agit d'un réseau à chercher à l'extérieur
```

::note

À partir d'ici, nous partons du principe que le nom du réseau de pingvin est `pingvin_default`. Vous pouvez vérifier que la connexion fonctionne en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
::

Redéployez la stack en cliquant sur « deploy » et attendez que SWAG soit complètement démarré.

### Créer le fichier subdomain.conf

Dans les dossiers de Swag, créez le fichier `pingvin.subdomain.conf`.

::tip{icon="" to="/serveex/files/file-browser-quantum"}

✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichiers et éditer vos documents plutôt que des commandes dans le terminal.
::

```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/pingvin.subdomain.conf
```
Collez la configuration ci-dessous :

```nginx [pingvin.subdomain.conf]
## Version 2023/12/19

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name pingvin.*;

    include /config/nginx/ssl.conf;

    client_max_body_size 0;

    #if ($lan-ip = yes) { set $geo-whitelist yes; }
    #if ($geo-whitelist = no) { return 404; }
    if ($geo-blacklist = no) { return 404; }

    # enable for ldap auth (requires ldap-location.conf in the location block)
    #include /config/nginx/ldap-server.conf;

    # enable for Authelia (requires authelia-location.conf in the location block)
    #include /config/nginx/authelia-server.conf;

    # enable for Authentik (requires authentik-location.conf in the location block)
    #include /config/nginx/authentik-server.conf;

    location / {
        # enable the next two lines for http auth
        #auth_basic "Restricted";
        #auth_basic_user_file /config/nginx/.htpasswd;

        # enable for ldap auth (requires ldap-server.conf in the server block)
        #include /config/nginx/ldap-location.conf;

        # enable for Authelia (requires authelia-server.conf in the server block)
        #include /config/nginx/authelia-location.conf;

        # enable for Authentik (requires authentik-server.conf in the server block)
        #include /config/nginx/authentik-location.conf;

        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app pingvin;
        set $upstream_port 3000;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

    }
}

```

Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.

### Terminé !
::

Et voilà, vous avez exposé Pingvin !

## Protéger Pingvin avec Pocket ID
Pingvin gère OIDC nativement, vous pouvez donc exiger une connexion Pocket ID avant de laisser qui que ce soit partager ou recevoir des fichiers, plutôt qu'avec (ou en plus de) les comptes propres à l'application.

::steps{level="3"}
### Enregistrer Pingvin comme client OIDC

[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) nommé `pingvin`, avec cette URL de callback :

```text
https://pingvin.mondomaine.fr/api/oauth/callback/oidc
```

### Activer le Social Login dans Pingvin

Dans Pingvin, allez dans _Administration > Configuration > Social Login_ et renseignez :

| Champ | Valeur |
|-------|-------|
| OpenID Connect | Activé |
| Discovery URI | L'URL de découverte OIDC de Pocket ID |
| Scope | `openid email profile groups` |

### Terminé !
::

Et voilà ! Désormais, quand vous vous connectez à Pingvin, un bouton « Open ID » est disponible sous le formulaire de connexion.

::::tip{icon=""}
✨ Vous pouvez utiliser [Authentik](/serveex/advanced/authentik) plutôt que Pocket ID :

:::collapsible{name="les étapes de configuration Authentik"}
::steps{level="4"}
#### Créer un provider OAuth2/OpenID

Dans l'espace d'administration d'Authentik, créez un provider OAuth2/OpenID.

#### Configurer le provider

Remplissez chaque section comme suit, en remplaçant `mondomaine.fr` par votre propre domaine. Copiez les champs `Client ID` et `Client Secret` en lieu sûr.

![picture](/img/serveex/pingvin-auth1.png)
![picture](/img/serveex/pingvin-auth2.png)
![picture](/img/serveex/pingvin-auth3.png)

#### Créer l'application

Enregistrez et créez une application `pingvin` comme suit.

![picture](/img/serveex/pingvin-auth4.png)

#### Ajouter le provider à votre outpost

Enregistrez et allez sur votre liste d'outposts. Ajoutez le provider pingvin à votre outpost.

#### Configurer les réglages OAuth de Pingvin

Quittez Authentik et allez dans l'interface d'administration de Pingvin. Dans la section _« OAuth »_, renseignez les champs suivants :

- `OpenID discovery URI` avec `https://pingvin.mondomaine.fr/application/o/pingvin/.well-known/openid-configuration` (n'oubliez pas de remplacer `mondomaine.fr` par votre propre domaine)
- `OpenID username claim` avec `preferred_username`
- `OpenID client ID` avec l'ID copié à l'étape 2.
- `OpenID client secret` avec le token copié à l'étape 2.

#### Terminé !
::

:::

::::
