mirror of
https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo.git
synced 2024-11-26 05:55:28 +00:00
Merge pull request 'Python' (#81) from Python into master
Reviewed-on: https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/pulls/81
This commit is contained in:
commit
7908c218fa
20
LICENSE
20
LICENSE
@ -1,20 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) <year> <copyright holders>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
||||
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
8
Plex Bot Music/README.md
Normal file
8
Plex Bot Music/README.md
Normal file
@ -0,0 +1,8 @@
|
||||
# Plex Bot Music
|
||||
|
||||
**Plex Bot Music est un bot écrit en Python. Il vous permettra d'écouter votre musique sur Discord au travers d'un bot, tel que Rythme mais vous serez limité à votre Bibliothèque**
|
||||
|
||||
|
||||
## Lien vers le répértoire
|
||||
|
||||
https://gitea.zoz-serv.org/gigidsss/Plex-Bot-Music
|
76
Plex Discord Activity/..README.md
Normal file
76
Plex Discord Activity/..README.md
Normal file
@ -0,0 +1,76 @@
|
||||
# Plex Discord Activity
|
||||
|
||||
**Plex Discord Activity est un logiciel en Python. Il a été récuperé déjà depuis le dépot d'un utilisateur GitHub mais a été simplifié de sorte a ce que la pré-configuration soit la plus simple possible**
|
||||
|
||||
Il y a eu peu de modifications par rapport à l'original, mais elles vous simplifient grandement la vie.
|
||||
|
||||
## Attention
|
||||
|
||||
Sachez que pour que le script fonctionne, il faut qu'il tourne sur le même PC que votre application Discord. Malheureusement faire tourner ce script sur un serveur en tâche de fond ne donnera aucun résultat...
|
||||
|
||||
## Installation
|
||||
|
||||
Pour cela, commencez déjà par installer Python3 sur votre ordinateur si cela n'est pas déjà fait...
|
||||
|
||||
Ensuite installez ces 2 bibliothèques Python via pip3:
|
||||
|
||||
```bash
|
||||
pip3 install plexapi
|
||||
pip3 install websocket-client==0.48.0
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Éditez le document pma.py et éditez ce paragraphe seulement:
|
||||
```python
|
||||
### SEULEMENT CE QUE VOUS DEVEZ EDITER
|
||||
|
||||
MyDomain = "https://your.plex.dns:32400" #Soit via votre nom de domaine, soit via le domaine de Plex, c'est à dire, https://app.plex.tv
|
||||
Serveur = "MyPlex" #Le nom de votre Serveur Plex, visible dans Paramètres > Général > Nom d'usage
|
||||
NomUser = "username" #Le nom d'utilisateur Plex pour récupérer les métadonnées et les informations de lecture en temps réel
|
||||
MotDePasse = "password" #Votre mot de passe de votre compte Plex
|
||||
MonToken = "your_token" #Votre Token, accessible a la fin de l'url lorsque vous consultez le fichier XML de l'un de vos médias
|
||||
BlackList = ["Musique", "BackingTracks"] #séparée par des virgules avec espace, entourées par des "", entrent 2 balises [], ex: ["bib1", "bib2"]
|
||||
UserOnly = "username" #Si vous avez crée des utilisateurs gérés, pour éviter de partager l'état de lecture d'un autre utilisateur que vous-même, précisez le psuedo du bon utilisateur a priori le même que le 3ème paramètre que vous...
|
||||
InfosSupp = "true" #Ceci partage les métadonnées de votre épisode si c'est sur True, sinon mettez False pour n'afficher que l'état de lecture
|
||||
TempsRestant = "true" #True = Afficher le temps restant de lecture / False = Afficher le nombre de minutes que vous avez déjà consulté depuis le démarrage de l'épisode
|
||||
|
||||
### END DE CE QUE VOUS DEVEZ EDITER
|
||||
```
|
||||
|
||||
Voici un résumé des paramètres:
|
||||
|
||||
**Attention a ne pas supprimer des guillemets ou des crochets... Si vous ne voulez pas préciser de valeur, laissez les guillemets vides ou indiquez-y ``none`` !**
|
||||
|
||||
**Serveur**: C'est le nom de votre serveur Plex. Vous le trouverez dans ``Paramètres > Général > Nom d'usage``
|
||||
|
||||
**NomUser**: Votre nom d'utilisateur Plex associé à votre compte.
|
||||
|
||||
**MotDePasse**: Votre mot de passe de l'utilisateur Plex associé à votre compte.
|
||||
|
||||
**MonToken**: Token que vous pouvez obtenir en consultant le fichier XML d'un de vos média. Allez sur un épisode ou film précis, allez dans ``Voir informations`` puis ``Voir le XML``. Ensuite regardez à la fin de votre URL, vous devriez avoir: **Plex-Token=0x0x0xx0x00xx0x0**
|
||||
|
||||
**BlackList**: Vous pouvez décider de ne pas partager sur Discord les médias d'une bibliothèque définie, indiquez-y entre guillemets et eux-même entre crochets, le nom des Bibliothèques.
|
||||
Exemple:
|
||||
```python
|
||||
BlackList = ["Musique", "BackingTracks"]
|
||||
```
|
||||
**UserOnly**: Si vous avez crée des utilisateurs gérés, pour éviter de partager l'état de lecture d'un autre utilisateur que vous-même, précisez le psuedo du bon utilisateur qui à priori est le même que celui du paramètre ``username``...
|
||||
|
||||
**InfosSupp**: Vous permet de partager davantage d'infos sur le média, à savoir les métadonnées, etc. (Réponse: True / False)
|
||||
|
||||
**TempsRestant**: Vous permet de préciser si vous voulez indiquer le temps restant du média ou la position actuelle (Réponse: True (Il reste 05:00 minutes) / False (Vous êtes à 15:00 minutes sur 20:00 minutes))
|
||||
|
||||
## Utilisation
|
||||
|
||||
```
|
||||
python3 pma.py
|
||||
```
|
||||
*Patientez +/- 20 secondes pour que le script démarre... Le script lancera tout seul la page web Plex*
|
||||
|
||||
## Source
|
||||
https://github.com/Phineas05/discord-rich-presence-plex
|
||||
|
||||
|
||||
## License
|
||||
[MIT](https://choosealicense.com/licenses/mit/)
|
76
Plex Discord Activity/README.md
Normal file
76
Plex Discord Activity/README.md
Normal file
@ -0,0 +1,76 @@
|
||||
# Plex Discord Activity
|
||||
|
||||
**Plex Discord Activity est un logiciel en Python. Il a été récuperé déjà depuis le dépot d'un utilisateur GitHub mais a été simplifié de sorte a ce que la pré-configuration soit la plus simple possible**
|
||||
|
||||
Il y a eu peu de modifications par rapport à l'original, mais elles vous simplifient grandement la vie.
|
||||
|
||||
## Attention
|
||||
|
||||
Sachez que pour que le script fonctionne, il faut qu'il tourne sur le même PC que votre application Discord. Malheureusement faire tourner ce script sur un serveur en tâche de fond ne donnera aucun résultat...
|
||||
|
||||
## Installation
|
||||
|
||||
Pour cela, commencez déjà par installer Python3 sur votre ordinateur si cela n'est pas déjà fait...
|
||||
|
||||
Ensuite installez ces 2 bibliothèques Python via pip3:
|
||||
|
||||
```bash
|
||||
pip3 install plexapi
|
||||
pip3 install websocket-client==0.48.0
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Éditez le document pma.py et éditez ce paragraphe seulement:
|
||||
```python
|
||||
### SEULEMENT CE QUE VOUS DEVEZ EDITER
|
||||
|
||||
MyDomain = "https://your.plex.dns:32400" #Soit via votre nom de domaine, soit via le domaine de Plex, c'est à dire, https://app.plex.tv
|
||||
Serveur = "MyPlex" #Le nom de votre Serveur Plex, visible dans Paramètres > Général > Nom d'usage
|
||||
NomUser = "username" #Le nom d'utilisateur Plex pour récupérer les métadonnées et les informations de lecture en temps réel
|
||||
MotDePasse = "password" #Votre mot de passe de votre compte Plex
|
||||
MonToken = "your_token" #Votre Token, accessible a la fin de l'url lorsque vous consultez le fichier XML de l'un de vos médias
|
||||
BlackList = ["Musique", "BackingTracks"] #séparée par des virgules avec espace, entourées par des "", entrent 2 balises [], ex: ["bib1", "bib2"]
|
||||
UserOnly = "username" #Si vous avez crée des utilisateurs gérés, pour éviter de partager l'état de lecture d'un autre utilisateur que vous-même, précisez le psuedo du bon utilisateur a priori le même que le 3ème paramètre que vous...
|
||||
InfosSupp = "true" #Ceci partage les métadonnées de votre épisode si c'est sur True, sinon mettez False pour n'afficher que l'état de lecture
|
||||
TempsRestant = "true" #True = Afficher le temps restant de lecture / False = Afficher le nombre de minutes que vous avez déjà consulté depuis le démarrage de l'épisode
|
||||
|
||||
### END DE CE QUE VOUS DEVEZ EDITER
|
||||
```
|
||||
|
||||
Voici un résumé des paramètres:
|
||||
|
||||
**Attention a ne pas supprimer des guillemets ou des crochets... Si vous ne voulez pas préciser de valeur, laissez les guillemets vides ou indiquez-y ``none`` !**
|
||||
|
||||
**Serveur**: C'est le nom de votre serveur Plex. Vous le trouverez dans ``Paramètres > Général > Nom d'usage``
|
||||
|
||||
**NomUser**: Votre nom d'utilisateur Plex associé à votre compte.
|
||||
|
||||
**MotDePasse**: Votre mot de passe de l'utilisateur Plex associé à votre compte.
|
||||
|
||||
**MonToken**: Token que vous pouvez obtenir en consultant le fichier XML d'un de vos média. Allez sur un épisode ou film précis, allez dans ``Voir informations`` puis ``Voir le XML``. Ensuite regardez à la fin de votre URL, vous devriez avoir: **Plex-Token=0x0x0xx0x00xx0x0**
|
||||
|
||||
**BlackList**: Vous pouvez décider de ne pas partager sur Discord les médias d'une bibliothèque définie, indiquez-y entre guillemets et eux-même entre crochets, le nom des Bibliothèques.
|
||||
Exemple:
|
||||
```python
|
||||
BlackList = ["Musique", "BackingTracks"]
|
||||
```
|
||||
**UserOnly**: Si vous avez crée des utilisateurs gérés, pour éviter de partager l'état de lecture d'un autre utilisateur que vous-même, précisez le psuedo du bon utilisateur qui à priori est le même que celui du paramètre ``username``...
|
||||
|
||||
**InfosSupp**: Vous permet de partager davantage d'infos sur le média, à savoir les métadonnées, etc. (Réponse: True / False)
|
||||
|
||||
**TempsRestant**: Vous permet de préciser si vous voulez indiquer le temps restant du média ou la position actuelle (Réponse: True (Il reste 05:00 minutes) / False (Vous êtes à 15:00 minutes sur 20:00 minutes))
|
||||
|
||||
## Utilisation
|
||||
|
||||
```
|
||||
python3 pma.py
|
||||
```
|
||||
*Patientez +/- 20 secondes pour que le script démarre... Le script lancera tout seul la page web Plex*
|
||||
|
||||
## Source
|
||||
https://github.com/Phineas05/discord-rich-presence-plex
|
||||
|
||||
|
||||
## License
|
||||
[MIT](https://choosealicense.com/licenses/mit/)
|
413
Plex Discord Activity/pda.py
Normal file
413
Plex Discord Activity/pda.py
Normal file
@ -0,0 +1,413 @@
|
||||
import asyncio
|
||||
import datetime
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import plexapi.myplex
|
||||
import struct
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import threading
|
||||
import time
|
||||
import webbrowser
|
||||
|
||||
### SEULEMENT CE QUE VOUS DEVEZ EDITER
|
||||
|
||||
MyDomain = "https://your.plex.dns:32400" #Soit via votre nom de domaine, soit via le domaine de Plex, c'est à dire, https://app.plex.tv
|
||||
Serveur = "MyPlex" #Le nom de votre Serveur Plex, visible dans Paramètres > Général > Nom d'usage
|
||||
NomUser = "username" #Le nom d'utilisateur Plex pour récupérer les métadonnées et les informations de lecture en temps réel
|
||||
MotDePasse = "password" #Votre mot de passe de votre compte Plex
|
||||
MonToken = "your_token" #Votre Token, accessible a la fin de l'url lorsque vous consultez le fichier XML de l'un de vos médias
|
||||
BlackList = ["Musique", "BackingTracks"] #séparée par des virgules avec espace, entourées par des "", entrent 2 balises [], ex: ["bib1", "bib2"]
|
||||
UserOnly = "username" #Si vous avez crée des utilisateurs gérés, pour éviter de partager l'état de lecture d'un autre utilisateur que vous-même, précisez le psuedo du bon utilisateur a priori le même que le 3ème paramètre que vous...
|
||||
InfosSupp = "true" #Ceci partage les métadonnées de votre épisode si c'est sur True, sinon mettez False pour n'afficher que l'état de lecture
|
||||
TempsRestant = "true" #True = Afficher le temps restant de lecture / False = Afficher le nombre de minutes que vous avez déjà consulté depuis le démarrage de l'épisode
|
||||
|
||||
### END DE CE QUE VOUS DEVEZ EDITER
|
||||
|
||||
webbrowser.open(MyDomain)
|
||||
|
||||
class plexConfig:
|
||||
|
||||
extraLogging = (InfosSupp)
|
||||
timeRemaining = (TempsRestant)
|
||||
|
||||
def __init__(self, serverName = "", username = "", password = "", token = "", listenForUser = "", blacklistedLibraries = None, whitelistedLibraries = None, clientID = "413407336082833418"):
|
||||
self.serverName = serverName
|
||||
self.username = username
|
||||
self.password = password
|
||||
self.token = token
|
||||
self.listenForUser = (username if listenForUser == "" else listenForUser).lower()
|
||||
self.blacklistedLibraries = blacklistedLibraries
|
||||
self.whitelistedLibraries = whitelistedLibraries
|
||||
self.clientID = clientID
|
||||
|
||||
plexConfigs = [
|
||||
plexConfig(serverName = (Serveur), username = (NomUser), password = (MotDePasse), token = (MonToken), blacklistedLibraries = (BlackList), listenForUser = (UserOnly))
|
||||
]
|
||||
|
||||
class discordRichPresence:
|
||||
|
||||
def __init__(self, clientID, child):
|
||||
self.IPCPipe = ((os.environ.get("XDG_RUNTIME_DIR", None) or os.environ.get("TMPDIR", None) or os.environ.get("TMP", None) or os.environ.get("TEMP", None) or "/tmp") + "/discord-ipc-0") if isLinux else "\\\\?\\pipe\\discord-ipc-0"
|
||||
self.clientID = clientID
|
||||
self.pipeReader = None
|
||||
self.pipeWriter = None
|
||||
self.process = None
|
||||
self.running = False
|
||||
self.child = child
|
||||
|
||||
async def read(self):
|
||||
try:
|
||||
data = await self.pipeReader.read(1024)
|
||||
self.child.log("[READ] " + str(json.loads(data[8:].decode("utf-8"))))
|
||||
except Exception as e:
|
||||
self.child.log("[READ] " + str(e))
|
||||
self.stop()
|
||||
|
||||
def write(self, op, payload):
|
||||
payload = json.dumps(payload)
|
||||
self.child.log("[WRITE] " + str(payload))
|
||||
data = self.pipeWriter.write(struct.pack("<ii", op, len(payload)) + payload.encode("utf-8"))
|
||||
|
||||
async def handshake(self):
|
||||
try:
|
||||
if (isLinux):
|
||||
self.pipeReader, self.pipeWriter = await asyncio.open_unix_connection(self.IPCPipe, loop = self.loop)
|
||||
else:
|
||||
self.pipeReader = asyncio.StreamReader(loop = self.loop)
|
||||
self.pipeWriter, _ = await self.loop.create_pipe_connection(lambda: asyncio.StreamReaderProtocol(self.pipeReader, loop = self.loop), self.IPCPipe)
|
||||
self.write(0, {"v": 1, "client_id": self.clientID})
|
||||
await self.read()
|
||||
self.running = True
|
||||
except Exception as e:
|
||||
self.child.log("[HANDSHAKE] " + str(e))
|
||||
|
||||
def start(self):
|
||||
self.child.log("Opening Discord IPC Pipe")
|
||||
emptyProcessFilePath = tempfile.gettempdir() + ("/" if isLinux else "\\") + "discordRichPresencePlex-emptyProcess.py"
|
||||
if (not os.path.exists(emptyProcessFilePath)):
|
||||
with open(emptyProcessFilePath, "w") as emptyProcessFile:
|
||||
emptyProcessFile.write("import time\n\ntry:\n\twhile (True):\n\t\ttime.sleep(3600)\nexcept:\n\tpass")
|
||||
self.process = subprocess.Popen(["python3" if isLinux else "pythonw", emptyProcessFilePath])
|
||||
self.loop = asyncio.new_event_loop() if isLinux else asyncio.ProactorEventLoop()
|
||||
self.loop.run_until_complete(self.handshake())
|
||||
|
||||
def stop(self):
|
||||
self.child.log("Closing Discord IPC Pipe")
|
||||
self.child.lastState, self.child.lastSessionKey, self.child.lastRatingKey = None, None, None
|
||||
self.process.kill()
|
||||
if (self.child.stopTimer):
|
||||
self.child.stopTimer.cancel()
|
||||
self.child.stopTimer = None
|
||||
if (self.child.stopTimer2):
|
||||
self.child.stopTimer2.cancel()
|
||||
self.child.stopTimer2 = None
|
||||
if (self.pipeWriter):
|
||||
try:
|
||||
self.pipeWriter.close()
|
||||
except:
|
||||
pass
|
||||
self.pipeWriter = None
|
||||
if (self.pipeReader):
|
||||
try:
|
||||
self.loop.run_until_complete(self.pipeReader.read(1024))
|
||||
except:
|
||||
pass
|
||||
self.pipeReader = None
|
||||
try:
|
||||
self.loop.close()
|
||||
except:
|
||||
pass
|
||||
self.running = False
|
||||
|
||||
def send(self, activity):
|
||||
payload = {
|
||||
"cmd": "SET_ACTIVITY",
|
||||
"args": {
|
||||
"activity": activity,
|
||||
"pid": self.process.pid
|
||||
},
|
||||
"nonce": "{0:.20f}".format(time.time())
|
||||
}
|
||||
self.write(1, payload)
|
||||
self.loop.run_until_complete(self.read())
|
||||
|
||||
class discordRichPresencePlex(discordRichPresence):
|
||||
|
||||
productName = "Plex Media Server"
|
||||
stopTimerInterval = 5
|
||||
stopTimer2Interval = 35
|
||||
checkConnectionTimerInterval = 60
|
||||
maximumIgnores = 3
|
||||
|
||||
def __init__(self, plexConfig):
|
||||
self.plexConfig = plexConfig
|
||||
self.instanceID = hashlib.md5(str(id(self)).encode("UTF-8")).hexdigest()[:5]
|
||||
super().__init__(plexConfig.clientID, self)
|
||||
self.plexAccount = None
|
||||
self.plexServer = None
|
||||
self.isServerOwner = False
|
||||
self.plexAlertListener = None
|
||||
self.lastState = None
|
||||
self.lastSessionKey = None
|
||||
self.lastRatingKey = None
|
||||
self.stopTimer = None
|
||||
self.stopTimer2 = None
|
||||
self.checkConnectionTimer = None
|
||||
self.ignoreCount = 0
|
||||
|
||||
def run(self):
|
||||
self.reset()
|
||||
connected = False
|
||||
while (not connected):
|
||||
try:
|
||||
if (self.plexConfig.token):
|
||||
self.plexAccount = plexapi.myplex.MyPlexAccount(self.plexConfig.username, token = self.plexConfig.token)
|
||||
else:
|
||||
self.plexAccount = plexapi.myplex.MyPlexAccount(self.plexConfig.username, self.plexConfig.password)
|
||||
self.log("Logged in as Plex User \"" + self.plexAccount.username + "\"")
|
||||
self.plexServer = None
|
||||
for resource in self.plexAccount.resources():
|
||||
if (resource.product == self.productName and resource.name == self.plexConfig.serverName):
|
||||
self.plexServer = resource.connect()
|
||||
try:
|
||||
self.plexServer.account()
|
||||
self.isServerOwner = True
|
||||
except:
|
||||
pass
|
||||
self.log("Connected to " + self.productName + " \"" + self.plexConfig.serverName + "\"")
|
||||
self.plexAlertListener = self.plexServer.startAlertListener(self.onPlexServerAlert)
|
||||
self.log("Listening for PlaySessionStateNotification alerts from user \"" + self.plexConfig.listenForUser + "\"")
|
||||
if (self.checkConnectionTimer):
|
||||
self.checkConnectionTimer.cancel()
|
||||
self.checkConnectionTimer = None
|
||||
self.checkConnectionTimer = threading.Timer(self.checkConnectionTimerInterval, self.checkConnection)
|
||||
self.checkConnectionTimer.start()
|
||||
connected = True
|
||||
break
|
||||
if (not self.plexServer):
|
||||
self.log(self.productName + " \"" + self.plexConfig.serverName + "\" not found")
|
||||
break
|
||||
except Exception as e:
|
||||
self.log("Failed to connect to Plex: " + str(e))
|
||||
self.log("Reconnecting in 10 seconds")
|
||||
time.sleep(10)
|
||||
|
||||
def reset(self):
|
||||
if (self.running):
|
||||
self.stop()
|
||||
self.plexAccount, self.plexServer = None, None
|
||||
if (self.plexAlertListener):
|
||||
try:
|
||||
self.plexAlertListener.stop()
|
||||
except:
|
||||
pass
|
||||
self.plexAlertListener = None
|
||||
if (self.stopTimer):
|
||||
self.stopTimer.cancel()
|
||||
self.stopTimer = None
|
||||
if (self.stopTimer2):
|
||||
self.stopTimer2.cancel()
|
||||
self.stopTimer2 = None
|
||||
if (self.checkConnectionTimer):
|
||||
self.checkConnectionTimer.cancel()
|
||||
self.checkConnectionTimer = None
|
||||
|
||||
def checkConnection(self):
|
||||
try:
|
||||
self.log("Request for clients list to check connection: " + str(self.plexServer.clients()), extra = True)
|
||||
self.checkConnectionTimer = threading.Timer(self.checkConnectionTimerInterval, self.checkConnection)
|
||||
self.checkConnectionTimer.start()
|
||||
except Exception as e:
|
||||
self.log("Connection to Plex lost: " + str(e))
|
||||
self.log("Reconnecting")
|
||||
self.run()
|
||||
|
||||
def log(self, text, colour = "", extra = False):
|
||||
timestamp = datetime.datetime.now().strftime("%I:%M:%S %p")
|
||||
prefix = "[" + timestamp + "] [" + self.plexConfig.serverName + "/" + self.instanceID + "] "
|
||||
lock.acquire()
|
||||
if (extra):
|
||||
if (self.plexConfig.extraLogging):
|
||||
print(prefix + colourText(str(text), colour))
|
||||
else:
|
||||
print(prefix + colourText(str(text), colour))
|
||||
lock.release()
|
||||
|
||||
def onPlexServerAlert(self, data):
|
||||
if (not self.plexServer):
|
||||
return
|
||||
try:
|
||||
if (data["type"] == "playing" and "PlaySessionStateNotification" in data):
|
||||
sessionData = data["PlaySessionStateNotification"][0]
|
||||
state = sessionData["state"]
|
||||
sessionKey = int(sessionData["sessionKey"])
|
||||
ratingKey = int(sessionData["ratingKey"])
|
||||
viewOffset = int(sessionData["viewOffset"])
|
||||
self.log("Received Update: " + colourText(sessionData, "yellow").replace("'", "\""), extra = True)
|
||||
metadata = self.plexServer.fetchItem(ratingKey)
|
||||
libraryName = metadata.section().title
|
||||
if (isinstance(self.plexConfig.blacklistedLibraries, list)):
|
||||
if (libraryName in self.plexConfig.blacklistedLibraries):
|
||||
self.log("Library \"" + libraryName + "\" is blacklisted, ignoring", "yellow", True)
|
||||
return
|
||||
if (isinstance(self.plexConfig.whitelistedLibraries, list)):
|
||||
if (libraryName not in self.plexConfig.whitelistedLibraries):
|
||||
self.log("Library \"" + libraryName + "\" is not whitelisted, ignoring", "yellow", True)
|
||||
return
|
||||
if (self.lastSessionKey == sessionKey and self.lastRatingKey == ratingKey):
|
||||
if (self.stopTimer2):
|
||||
self.stopTimer2.cancel()
|
||||
self.stopTimer2 = None
|
||||
if (self.lastState == state):
|
||||
if (self.ignoreCount == self.maximumIgnores):
|
||||
self.ignoreCount = 0
|
||||
else:
|
||||
self.log("Nothing changed, ignoring", "yellow", True)
|
||||
self.ignoreCount += 1
|
||||
self.stopTimer2 = threading.Timer(self.stopTimer2Interval, self.stopOnNoUpdate)
|
||||
self.stopTimer2.start()
|
||||
return
|
||||
elif (state == "stopped"):
|
||||
self.lastState, self.lastSessionKey, self.lastRatingKey = None, None, None
|
||||
self.stopTimer = threading.Timer(self.stopTimerInterval, self.stop)
|
||||
self.stopTimer.start()
|
||||
self.log("Started stopTimer", "yellow", True)
|
||||
return
|
||||
elif (state == "stopped"):
|
||||
self.log("\"stopped\" state update from unknown session key, ignoring", "yellow", True)
|
||||
return
|
||||
if (self.isServerOwner):
|
||||
self.log("Checking Sessions for Session Key " + colourText(sessionKey, "yellow"), extra = True)
|
||||
plexServerSessions = self.plexServer.sessions()
|
||||
if (len(plexServerSessions) < 1):
|
||||
self.log("Empty session list, ignoring", "red", True)
|
||||
return
|
||||
for session in plexServerSessions:
|
||||
self.log(str(session) + ", Session Key: " + colourText(session.sessionKey, "yellow") + ", Users: " + colourText(session.usernames, "yellow").replace("'", "\""), extra = True)
|
||||
sessionFound = False
|
||||
if (session.sessionKey == sessionKey):
|
||||
sessionFound = True
|
||||
self.log("Session found", "green", True)
|
||||
if (session.usernames[0].lower() == self.plexConfig.listenForUser):
|
||||
self.log("Username \"" + session.usernames[0].lower() + "\" matches \"" + self.plexConfig.listenForUser + "\", continuing", "green", True)
|
||||
break
|
||||
else:
|
||||
self.log("Username \"" + session.usernames[0].lower() + "\" doesn't match \"" + self.plexConfig.listenForUser + "\", ignoring", "red", True)
|
||||
return
|
||||
if (not sessionFound):
|
||||
self.log("No matching session found", "red", True)
|
||||
return
|
||||
if (self.stopTimer):
|
||||
self.stopTimer.cancel()
|
||||
self.stopTimer = None
|
||||
if (self.stopTimer2):
|
||||
self.stopTimer2.cancel()
|
||||
self.stopTimer2 = threading.Timer(self.stopTimer2Interval, self.stopOnNoUpdate)
|
||||
self.stopTimer2.start()
|
||||
self.lastState, self.lastSessionKey, self.lastRatingKey = state, sessionKey, ratingKey
|
||||
mediaType = metadata.type
|
||||
if (state != "playing"):
|
||||
extra = secondsToText(viewOffset / 1000, ":") + "/" + secondsToText(metadata.duration / 1000, ":")
|
||||
else:
|
||||
extra = secondsToText(metadata.duration / 1000)
|
||||
if (mediaType == "movie"):
|
||||
title = metadata.title + " (" + str(metadata.year) + ")"
|
||||
extra = extra + " · " + ", ".join([genre.tag for genre in metadata.genres[:3]])
|
||||
largeText = "Watching a Movie"
|
||||
elif (mediaType == "episode"):
|
||||
title = metadata.grandparentTitle
|
||||
extra = extra + " · S" + str(metadata.parentIndex) + " · E" + str(metadata.index) + " - " + metadata.title
|
||||
largeText = "Watching a TV Show"
|
||||
elif (mediaType == "track"):
|
||||
title = metadata.title
|
||||
artist = metadata.originalTitle
|
||||
if (not artist):
|
||||
artist = metadata.grandparentTitle
|
||||
extra = artist + " · " + metadata.parentTitle
|
||||
largeText = "Listening to Music"
|
||||
else:
|
||||
self.log("Unsupported media type \"" + mediaType + "\", ignoring", "red", True)
|
||||
return
|
||||
activity = {
|
||||
"details": title,
|
||||
"state": extra,
|
||||
"assets": {
|
||||
"large_text": largeText,
|
||||
"large_image": "logo",
|
||||
"small_text": state.capitalize(),
|
||||
"small_image": state
|
||||
},
|
||||
}
|
||||
if (state == "playing"):
|
||||
currentTimestamp = int(time.time())
|
||||
if (self.plexConfig.timeRemaining):
|
||||
activity["timestamps"] = {"end": round(currentTimestamp + ((metadata.duration - viewOffset) / 1000))}
|
||||
else:
|
||||
activity["timestamps"] = {"start": round(currentTimestamp - (viewOffset / 1000))}
|
||||
if (not self.running):
|
||||
self.start()
|
||||
if (self.running):
|
||||
self.send(activity)
|
||||
else:
|
||||
self.stop()
|
||||
except Exception as e:
|
||||
self.log("onPlexServerAlert Error: " + str(e))
|
||||
|
||||
def stopOnNoUpdate(self):
|
||||
self.log("No updates from session key " + str(self.lastSessionKey) + ", stopping", "red", True)
|
||||
self.stop()
|
||||
|
||||
isLinux = sys.platform in ["linux", "darwin"]
|
||||
lock = threading.Semaphore(value = 1)
|
||||
|
||||
os.system("clear" if isLinux else "cls")
|
||||
|
||||
if (len(plexConfigs) == 0):
|
||||
print("Error: plexConfigs list is empty")
|
||||
sys.exit()
|
||||
|
||||
colours = {
|
||||
"red": "91",
|
||||
"green": "92",
|
||||
"yellow": "93",
|
||||
"blue": "94",
|
||||
"magenta": "96",
|
||||
"cyan": "97"
|
||||
}
|
||||
|
||||
def colourText(text, colour = ""):
|
||||
prefix = ""
|
||||
suffix = ""
|
||||
colour = colour.lower()
|
||||
if (colour in colours):
|
||||
prefix = "\033[" + colours[colour] + "m"
|
||||
suffix = "\033[0m"
|
||||
return prefix + str(text) + suffix
|
||||
|
||||
def secondsToText(seconds, joiner = ""):
|
||||
seconds = round(seconds)
|
||||
text = {"h": seconds // 3600, "m": seconds // 60 % 60, "s": seconds % 60}
|
||||
if (joiner == ""):
|
||||
text = [str(v) + k for k, v in text.items() if v > 0]
|
||||
else:
|
||||
if (text["h"] == 0):
|
||||
del text["h"]
|
||||
text = [str(v).rjust(2, "0") for k, v in text.items()]
|
||||
return joiner.join(text)
|
||||
|
||||
discordRichPresencePlexInstances = []
|
||||
for config in plexConfigs:
|
||||
discordRichPresencePlexInstances.append(discordRichPresencePlex(config))
|
||||
try:
|
||||
for discordRichPresencePlexInstance in discordRichPresencePlexInstances:
|
||||
discordRichPresencePlexInstance.run()
|
||||
while (True):
|
||||
time.sleep(3600)
|
||||
except KeyboardInterrupt:
|
||||
for discordRichPresencePlexInstance in discordRichPresencePlexInstances:
|
||||
discordRichPresencePlexInstance.reset()
|
||||
except Exception as e:
|
||||
print("Error: " + str(e))
|
24
README.md
24
README.md
@ -1,24 +0,0 @@
|
||||
# Repo Officiel du Discord Plex FR
|
||||
|
||||
## Table des matières
|
||||
* [Qui sommes-nous ?](#qui-sommes-nous)
|
||||
* [A quoi sert ce dépot ?](#a-quoi-sert-ce-dépot)
|
||||
* [Comment contribuer à ce dépot ?](#comment-contribuer-à-ce-dépot)
|
||||
* [Comment nous rejoindre ?](#comment-nous-rejoindre)
|
||||
|
||||
## Qui sommes-nous ?
|
||||
|
||||
Nous sommes une communauté francophone autour du logiciel Plex.
|
||||
...
|
||||
|
||||
## A quoi sert ce dépot ?
|
||||
|
||||
Ce dépot nous sert a stocker les composes / aides / tutos / ... qui nous permettent d'aider la communauté. L'avantage du dépot est que toutes les personnes inscrites peuvent contribuer.
|
||||
|
||||
## Comment contribuer à ce dépot ?
|
||||
|
||||
Lisez le README "Aide pour le repo" ici : https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/src/branch/master/README_GIT.md
|
||||
|
||||
## Comment nous rejoindre ?
|
||||
|
||||
Nous sommes sur Discord et Guilded, a ces adresses : https://discord.gg/ERpYMqS | https://guilded.gg/PlexFR
|
115
README_GIT.md
115
README_GIT.md
@ -1,115 +0,0 @@
|
||||
# AIDE POUR LE REPO
|
||||
|
||||
## Table des matières
|
||||
* [Comment utiliser Git](#comment-utiliser-git)
|
||||
* [Docker-compose](#docker-compose)
|
||||
* [Wiki](#wiki)
|
||||
|
||||
## Comment utiliser Git
|
||||
|
||||
Clonez le dépot sur votre machine `git clone https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo.git`
|
||||
|
||||
### Pour chaque modification, attention à bien suivre cette procédure si vous voulez éviter des conflits de versions
|
||||
|
||||
- Créez votre branche via la GUI Gitea (idéalement votre pseudo) ex : `Benj`
|
||||
|
||||
![mabanche](https://i.imgur.com/0KLNFSG.png)
|
||||
|
||||
- Rapatriez les dernières modifications : `git pull`
|
||||
- Mettez vous sur votre branche : `git checkout mabranche`
|
||||
- Faites vos modificatiosn (création de fichiers etc)
|
||||
- Récupérez les éventuelles denrières modifications : `git pull` puis `git merge master`
|
||||
- Ajoutez les nouveaux fichiers : `git add .` ou `git add -A`
|
||||
- Validez les modif : `git commit -m "ma super modif"`
|
||||
- Balancez sur le serveur : `git push`
|
||||
- Et ouvrez une merge request via la GUI, pensez à ajouter 1 ou 2 relecteurs, petite parenthèse
|
||||
le but de la relecture par les pairs permet d'éviter des erreurs (https://blog.groupe-sii.com/les-revues-de-code/)
|
||||
|
||||
Quand la merge request est close et/ou mergé, le relecteur supprime votre branche,
|
||||
vous pourrez la recréer plus tard quand vous aurez besoin...
|
||||
|
||||
### Petit reminder
|
||||
|
||||
- **ON NE TRAVAILLE JAMAIS SUR LE MASTER**
|
||||
|
||||
- **Un renommage de répertoire cause un conflit généralement, nécessite intervention manuelle**
|
||||
|
||||
- `git status` > donne la branche courante ainsi que l'état des fichiers modifiés
|
||||
> git status
|
||||
> Sur la branche master
|
||||
> Votre branche est à jour avec 'origin/master'.
|
||||
>
|
||||
> Modifications qui ne seront pas validées :
|
||||
> (utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
|
||||
> (utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
|
||||
>
|
||||
> modifié : README.md
|
||||
>
|
||||
> aucune modification n'a été ajoutée à la validation (utilisez "git add" ou "git commit -a")
|
||||
|
||||
|
||||
- `git add toto.pouet` ou `git add .` > ajout les modifications sur toto.pouet ou sur tous les fichiers au prochain commit
|
||||
|
||||
|
||||
- `git commit -m "mon super message"` > on pose le commit avec un message qui explique ce que l'on a fait (pratique pour retrouver ca plus tard si besoin)
|
||||
|
||||
|
||||
- `git pull` > on récupère toutes les dernières modifs du serveur
|
||||
|
||||
|
||||
- `git merge master` > (doit être fait après un `git pull`) on récupère toutes les dernières modifs du master pour les mettre sur la branche courante
|
||||
|
||||
### Au secours
|
||||
|
||||
#### J'ai fait mes modif sur le master (sans commit)
|
||||
|
||||
- `git stash` > je sauvegarde mes modifs en local et rétablis le dernier commit
|
||||
- `git pull` > je récupère des dernières modifs du serveur
|
||||
- `git checkout mabranche` > je changement de branche
|
||||
- `git merge master` > je récupère les dernières modifs du master sur ma branche
|
||||
- `git stash apply` > j'applique ma sauvegarde local
|
||||
- je poursuis mes modifs et je add/commit/push quand j'ai fini
|
||||
|
||||
## Docker-compose
|
||||
|
||||
### Fonctionnement
|
||||
|
||||
Le répertoire `docker-compose/` contient uniquement les docker-compose de chaque service/application.
|
||||
|
||||
L'arborescence doit être la suivante :
|
||||
`docker-compose/<app>/docker-compose.yml`
|
||||
- `<app>` : le nom de l'application ou service à rajouter
|
||||
|
||||
### Possibilité
|
||||
|
||||
Le bot pourrait appeler le contenu de chaque application selon cette commande
|
||||
`.docker-compose <app>`
|
||||
Il chercherait selon l'url suivant :
|
||||
`https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/raw/branch/master/docker-compose/<app>/docker-compose.yml`
|
||||
Si HTTP 200 alors on affiche le contenu retourné
|
||||
Sinon HTTP 404 alors on affiche `la page n'existe pas`
|
||||
|
||||
|
||||
Exemple ok:
|
||||
> `.docker-compose plex`
|
||||
> renvoie le contenu de
|
||||
> https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/raw/branch/master/docker-compose/plex/docker-compose.yml
|
||||
|
||||
Exemple ko:
|
||||
> `.docker-compose pouet`
|
||||
> renvoie `La page que vous demandez n'existe pas`
|
||||
|
||||
|
||||
|
||||
## Wiki
|
||||
|
||||
fichiers au format md (markdown)
|
||||
|
||||
### Possibilité
|
||||
|
||||
Le bot pourrait appeler le contenu de chaque application selon cette commande
|
||||
`.wiki <doc>`
|
||||
Il chercherait selon l'url suivant :
|
||||
`https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/raw/branch/master/wiki/<doc>.md`
|
||||
Si HTTP 200 alors on affiche le contenu retourné
|
||||
Sinon HTTP 404 alors on affiche `la page n'existe pas`
|
@ -1,33 +0,0 @@
|
||||
# Liste de blocage DNS pour AdGuard-Home
|
||||
|
||||
## Listes disponibles avec une simple case à cocher :
|
||||
|
||||
* Il faut aller dans le menu **Filtres** -> **Liste de blocage DNS**.
|
||||
|
||||
* Puis, il faut cliquer sur le bouton vert "**Ajouter une liste de blocage**.
|
||||
|
||||
* Et enfin, cliquer sur le bouton "**Choisissez dans la liste**".
|
||||
|
||||
* Choisir ensuite ces listes : (la première est incluse dans une liste à ajouter manuellement ensuite)
|
||||
|
||||
![image](https://gitea.zoz-serv.org/attachments/640b8667-ad65-4986-aad1-05151b81ab83)
|
||||
|
||||
![image](https://gitea.zoz-serv.org/attachments/2b17f2e0-66d5-4f4c-9a71-acbf1f59bc9c)
|
||||
|
||||
## Listes à ajouter manuellement (pris dans le fichier de configuration AdGuardHome.yaml) :
|
||||
|
||||
* `Nom de la liste` (à placer dans le champ adéquat) <br/>
|
||||
[URL de la liste](URL)
|
||||
<br/><br/>
|
||||
|
||||
* `sebsauvage.net hosts-adguard`<br/>
|
||||
https://sebsauvage.net/hosts/hosts-adguard
|
||||
|
||||
* `firebog.net - NoTrack-blocklist`<br/>
|
||||
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt
|
||||
|
||||
* `firebog.net - SmartTV`<br/>
|
||||
https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt
|
||||
|
||||
* `Firebog.net - ads-and-tracking-extended`<br/>
|
||||
https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt
|
@ -1,50 +0,0 @@
|
||||
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/mobile.txt
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/smarttv.txt
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/nomsdata.txt
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/gamefake.txt
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/jbfake.txt
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/fakenewsde.txt
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/adobeblock.txt
|
||||
https://raw.githubusercontent.com/Akamaru/Pi-Hole-Lists/master/other.txt
|
||||
https://justdomains.github.io/blocklists/lists/easylist-justdomains.txt
|
||||
https://raw.githubusercontent.com/kboghdady/youTube_ads_4_pi-hole/master/black.list
|
||||
https://www.github.developerdan.com/hosts/lists/amp-hosts-extended.txt
|
||||
https://www.github.developerdan.com/hosts/lists/tracking-aggressive-extended.txt
|
||||
https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt
|
||||
https://raw.githubusercontent.com/PolishFiltersTeam/KADhosts/master/KADhosts_without_controversies.txt
|
||||
https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Spam/hosts
|
||||
https://v.firebog.net/hosts/static/w3kbl.txt
|
||||
https://adaway.org/hosts.txt
|
||||
https://v.firebog.net/hosts/AdguardDNS.txt
|
||||
https://v.firebog.net/hosts/Admiral.txt
|
||||
https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt
|
||||
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
|
||||
https://v.firebog.net/hosts/Easylist.txt
|
||||
https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
|
||||
https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts
|
||||
https://raw.githubusercontent.com/bigdargon/hostsVN/master/hosts
|
||||
https://v.firebog.net/hosts/Easyprivacy.txt
|
||||
https://v.firebog.net/hosts/Prigent-Ads.txt
|
||||
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt
|
||||
https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.2o7Net/hosts
|
||||
https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt
|
||||
https://hostfiles.frogeye.fr/firstparty-trackers-hosts.txt
|
||||
https://zerodot1.gitlab.io/CoinBlockerLists/hosts_browser
|
||||
https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareHosts.txt
|
||||
https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt
|
||||
https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt
|
||||
https://mirror1.malwaredomains.com/files/justdomains
|
||||
https://v.firebog.net/hosts/Prigent-Crypto.txt
|
||||
https://mirror.cedia.org.ec/malwaredomains/immortal_domains.txt
|
||||
https://www.malwaredomainlist.com/hostslist/hosts.txt
|
||||
https://bitbucket.org/ethanr/dns-blacklists/raw/8575c9f96e5b4a1308f2f12394abd86d0927a4a0/bad_lists/Mandiant_APT1_Report_Appendix_D.txt
|
||||
https://phishing.army/download/phishing_army_blocklist_extended.txt
|
||||
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt
|
||||
https://v.firebog.net/hosts/Shalla-mal.txt
|
||||
https://raw.githubusercontent.com/Spam404/lists/master/main-blacklist.txt
|
||||
https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Risk/hosts
|
||||
https://urlhaus.abuse.ch/downloads/hostfile/
|
||||
https://emmanuel-lecoq.fr/wp-content/uploads/2020/02/Pi-hole-list.txt
|
||||
https://ransomwaretracker.abuse.ch/downloads/RW_DOMBL.txt
|
||||
https://gitlab.com/ZeroDot1/CoinBlockerLists/raw/master/list.txt
|
@ -1,16 +0,0 @@
|
||||
# Listes d’autorisation DNS pour AdGuard-Home
|
||||
|
||||
## Listes à ajouter manuellement (pris dans le fichier de configuration AdGuardHome.yaml) :
|
||||
|
||||
- `Nom de la liste` (à placer dans le champ adéquat) <br/>
|
||||
[URL de la liste](URL)
|
||||
<br/><br/>
|
||||
|
||||
* `anudeepND/whitelist`<br/>
|
||||
https://raw.githubusercontent.com/anudeepND/whitelist/master/domains/whitelist.txt
|
||||
|
||||
* `hg1978 / AdGuard-Home-Whitelist`<br/>
|
||||
https://raw.githubusercontent.com/hg1978/AdGuard-Home-Whitelist/master/whitelist.txt
|
||||
|
||||
* `hg1978 / AdGuard-Home-Whitelist`<br/>
|
||||
https://raw.githubusercontent.com/hg1978/AdGuard-Home-Whitelist/master/facebook-whitelist.txt
|
@ -1,54 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
##===========================================================================================##
|
||||
## Script bridgemacvlan-interface.sh ##
|
||||
## ##
|
||||
## Script de création d'interface virtuelle pour les conteneurs en macvlan ##
|
||||
## Voir tutos : ##
|
||||
## https://www.nas-forum.com/forum/topic/69319-tuto-docker-macvlan-pi-hole/ ##
|
||||
## https://www.nas-forum.com/forum/topic/67311-tuto-certificat-ssl-reverse-proxy-via-docker/ ##
|
||||
## ##
|
||||
## Rappels des différentes IP : ##
|
||||
## - Plage d'IP macvlan : 192.168.xxx.MMM/28 == 192.168.2.208/28 ##
|
||||
## - IP virtuelle unique : 192.168.xxx.zzz/32 == 192.168.2.210/32 ##
|
||||
## - Plage d'IP du LAN : 192.168.xxx.0/24 == 192.168.2.0/24 ##
|
||||
## - Passerelle/routeur : 192.168.xxx.1 == 192.168.2.1 ##
|
||||
## - IP conteneur n°1 : 192.168.xxx.yyy == 192.168.2.209 ##
|
||||
## - IP conteneur n°2 : 192.168.xxx.ooo == 192.168.2.210 AdGuard_Home ##
|
||||
## ##
|
||||
##=============================================================================================
|
||||
|
||||
# Set timeout to wait host network is up and running
|
||||
sleep 60
|
||||
|
||||
echo "$(date "+%R:%S - ") Script de création d'une interface virtuelle pour le NAS"
|
||||
echo "$(date "+%R:%S - ") Exécution des commandes..."
|
||||
|
||||
ip link add macv0 link eth0 type macvlan mode bridge # macv0 : est le nom données à l'interface virtuelle
|
||||
# eth0 : est l'interface réseau utilisée sur le NAS (lorsque VMM n'est pas utilisé)
|
||||
# si VMM est utilisé, ce sera ovs_eth0
|
||||
ip addr add 192.168.xxx.zzz/32 dev macv0 # Adresse IP virtuelle 192.168.x.zzz/32 -- Il faut que cette adresse soit libre dans le réseau
|
||||
# et qu'elle ne fasse pas partie du DHCP du routeur/box
|
||||
#
|
||||
#### Dans mon cas, c'est cette commande :
|
||||
#### ip addr add 192.168.2.230/32 dev macv0
|
||||
|
||||
ip link set dev macv0 address 5E:00:01:02:03:04 # MAC adresse pour l'adaptateur ayant l'IP virtuelle
|
||||
# Il faut que l'adresse MAC respecte ces conditions :
|
||||
# - Elle n'existe pas déjà sur mon hôte et sur mon réseau.
|
||||
# - Elle respecte la base hexadécimale, les notations allant de 0 à F.
|
||||
# - Le premier nombre doit être pair, ici 5E = 94 en base 10, c'est donc OK (vous pouvez
|
||||
# utiliser un convertisseur en ligne, ou faire vos divisions euclidiennes).
|
||||
# S'il est impair, vous aurez un message :
|
||||
# RTNETLINK answers: Cannot assign requested address
|
||||
ip link set macv0 up
|
||||
|
||||
ip route add 192.168.xxx.MMM/28 dev macv0 # 192.168.xxx.MMM/28 : Plage d'adresse macvlan
|
||||
# IP réellement disponible : voir les calculateurs internet
|
||||
# Utiliser Portainer ou l'interface Docker ou encore le script : create-macvlan-network.sh
|
||||
#
|
||||
#### Dans mon cas, c'est cette commande :
|
||||
#### ip route add 192.168.2.208/28 dev macv0
|
||||
|
||||
echo "$(date "+%R:%S - ") Script terminé"
|
||||
exit
|
@ -1,86 +0,0 @@
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Fichier docker-compose.yml pour Adguard-Home en macvlan ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##============================================================================================##
|
||||
## ##
|
||||
## Attention, il faut créer le réseau macvlan à l'aide du script : macvlan-network.sh ##
|
||||
## Ce dernier va créer un réseau macvlan ayant comme IP unique 192.168.2.210 ##
|
||||
## Cette IP doit être dans la plage d'IP mavclan définie dans le script de création du réseau.##
|
||||
## Le conteneur sera donc vu comme une machine sur le réseau LAN, mais ne pourra pas être ##
|
||||
## joint par le NAS lui-même. ##
|
||||
## Pour celà, il faut utiliser le second script : boot-bridgemacvlan-interface.sh ##
|
||||
## Ce dernier va créer une IP-interface virtuelle qui pourra être accessible par le NAS. ##
|
||||
## Cette interface ne persiste pas au démarrage, il faudra mettre le script en tâche ##
|
||||
## planifiée avec le planificateur de tâches dans DSM. ##
|
||||
## ##
|
||||
## Voir tuto : https://www.nas-forum.com/forum/topic/69319-tuto-docker-macvlan-pi-hole/ ##
|
||||
## ##
|
||||
## Attention ! ##
|
||||
## ##
|
||||
## Ces deux scripts ne sont à utiliser qu'une seule fois, quelque soit le nombre de ##
|
||||
## conteneurs qui en bénéficieront. ##
|
||||
## Par exemple, si vous utilisez 2 conteneurs en macvlan, une fois le réseau macvlan créé ##
|
||||
## pour le 1er, il est inutile (et impossible) de le recréer. ##
|
||||
## Le script boot-bridgemacvlan-interface.sh ne doit être lancé qu'une seule fois, et à ##
|
||||
## chaque reboot. L'IP virtuelle est unique, il ne faut pas en recréer une seconde. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
---
|
||||
version: "2.4"
|
||||
services:
|
||||
adguardhome_macvlan:
|
||||
image: adguard/adguardhome:latest # https://github.com/AdguardTeam/AdGuardHome
|
||||
# https://github.com/AdguardTeam/AdGuardHome/wiki/Docker
|
||||
container_name: adguardhome_macvlan
|
||||
|
||||
hostname: AdGuard-Home--DS920+ # Permet d'avoir un nom pour le conteneur dans AdGuard lui même (sinon c'est une chaine aléatoire)
|
||||
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=100 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
- LANG=fr_FR.UTF8
|
||||
- LANGUAGE=fr_FR.UTF8
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Le label ci-dessous permet à Watchtower de faire les mises à jour automatiquement
|
||||
# Cela peut-être supprimé si Watchtower n'est pas utilisé.
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
volumes:
|
||||
- "/volume1/docker/adguardhome_macvlan/work:/opt/adguardhome/work"
|
||||
- "/volume1/docker/adguardhome_macvlan/conf:/opt/adguardhome/conf"
|
||||
|
||||
# La déclaration des ports n'est pas utile lors d'une installation en macvlan, car tous les ports seront directement accessible
|
||||
# avec l'IP virtuelle.
|
||||
# ports:
|
||||
# - "953:53"
|
||||
# - "967:67/udp"
|
||||
# - "968:68"
|
||||
# - "8080:80/tcp"
|
||||
# - "9443:443/tcp"
|
||||
# - "9853:853/tcp"
|
||||
# - "3030:3000/tcp"
|
||||
|
||||
networks:
|
||||
macvlan-network:
|
||||
ipv4_address: 192.168.xxx.yyy # Mettre ici l'IP macvlan dans la plage définie dans les scripts
|
||||
# Dans mon cas c'est 192.168.2.210
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
healthcheck:
|
||||
test: "/bin/netstat -pant | /bin/grep 53"
|
||||
interval: 45s
|
||||
timeout: 30s
|
||||
retries: 3
|
||||
|
||||
networks:
|
||||
macvlan-network: # Ce réseau devra bien entendu être créé avant avec le script annexe ou avec Portainer.
|
||||
external: true
|
@ -1,59 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
##============================================================================================##
|
||||
## ##
|
||||
## Script docker_network_create_macvlan.sh ##
|
||||
## ##
|
||||
## Script de création d'interface virtuelle pour les conteneurs qui auront une IP macvlan ##
|
||||
## Voir tutos : ##
|
||||
## https://www.nas-forum.com/forum/topic/69319-tuto-docker-macvlan-pi-hole/ ##
|
||||
## https://www.nas-forum.com/forum/topic/67311-tuto-certificat-ssl-reverse-proxy-via-docker/ ##
|
||||
## ##
|
||||
## Les IPs prévues pour les conteneurs sont : ##
|
||||
## - Conteneur A : 192.168.xxx.yyy ##
|
||||
## - AdGuard-Home : 192.168.xxx.ooo ##
|
||||
## ##
|
||||
## Rappels des différentes IP : ##
|
||||
## - Plage d'IP macvlan : 192.168.xxx.MMM/28 ##
|
||||
## - IP virtuelle unique : 192.168.xxx.zzz/32 ##
|
||||
## - IP conteneur n°1 : 192.168.xxx.yyy ##
|
||||
## - IP conteneur n°2 : 192.168.xxx.ooo ##
|
||||
## - Plage d'IP du LAN : 192.168.xxx.0/24 ##
|
||||
## - Passerelle/routeur : 192.168.xxx.1 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## --ip-range=192.168.xxx.MMM/28 : cela correspond à la plage d'IP pour le réseau macvlan ##
|
||||
## sachant que 192.168.xxx.MMM doit être la 1ère IP donnée par les calculateurs internet. ##
|
||||
## Il se peut que ce ne soit pas la même que l'IP macvlan que l'on veut donner au conteneur ##
|
||||
## AdGuardHome. ##
|
||||
## ##
|
||||
## Quelques calculateurs internet : ##
|
||||
## https://cric.grenoble.cnrs.fr/Administrateurs/Outils/CalculMasque/ ##
|
||||
## https://www.cidr.eu/en/calculator/+/192.168.2.208/28 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
|
||||
docker network create -d macvlan \
|
||||
--subnet=192.168.xxx.0/24 \
|
||||
--ip-range=192.168.xxx.MMM/28 \
|
||||
--gateway=192.168.xxx.1 \
|
||||
-o parent=eth0 \ # Ici, eth0 est à remplacer par votre interface réseau : eth0, ovs_eth0 ou autre...
|
||||
macvlan-network
|
||||
|
||||
##==============================================================================================
|
||||
## Pour exemple, voilà mes valeurs à moi : ##
|
||||
## ##
|
||||
## - Conteneur A : 192.168.2.209 ##
|
||||
## - AdGuard-Home : 192.168.2.210 ##
|
||||
## - Conteneur B : 192.168.2.211 ##
|
||||
## ##
|
||||
## Rappels des différentes IP : ##
|
||||
## - Plage d'IP macvlan : 192.168.xxx.MMM/28 == 192.168.2.208/28 ##
|
||||
## - IP virtuelle unique : 192.168.xxx.zzz/32 == 192.168.2.210/32 ##
|
||||
## - Plage d'IP du LAN : 192.168.xxx.0/24 == 192.168.2.0/24 ##
|
||||
## - Passerelle/routeur : 192.168.xxx.1 == 192.168.2.1 ##
|
||||
##==============================================================================================
|
@ -1,25 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: '3.3'
|
||||
services:
|
||||
adguardhome:
|
||||
container_name: adguardhome
|
||||
volumes:
|
||||
- /volume1/docker/adguard/work:/opt/adguardhome/work
|
||||
- /volume1/docker/adguard/conf:/opt/adguardhome/conf
|
||||
ports:
|
||||
- '53:53/tcp'
|
||||
- '53:53/udp'
|
||||
- '80:80/tcp' # WebUI suite config validé
|
||||
- '3000:3000/tcp' # WebUI 1ere connexion pour configurer
|
||||
- '443:443/tcp'
|
||||
- '853:853/tcp'
|
||||
image: adguard/adguardhome
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
# Si vous souhaiter utiliser le serveur dhcp il faut utiliser host
|
||||
network_mode: adguard_network
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
|
@ -1,21 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
bitwarden:
|
||||
image: bitwardenrs/server
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
ports:
|
||||
- 80:80 # WebUI
|
||||
volumes:
|
||||
- /volume1/docker/bitwarden/bw-data:/data
|
||||
environment:
|
||||
- WEBSOCKET_ENABLED: 'true' # Necessaire pour utiliser websockets
|
||||
- SIGNUPS_ALLOWED: 'true' # Mettre faux une fois le 1er utilisateur creer et redemarrer le conteneur
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: 'bitwardenrs_network'
|
||||
|
@ -1,19 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-03
|
||||
version: '3.3'
|
||||
services:
|
||||
linuxserver:
|
||||
container_name: duckdns
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
- SUBDOMAINS=XXXXX # Votre subdomain duckdns sans www
|
||||
- TOKEN=XXXXX # A récupéré sur le site de duckdns
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: 'ghcr.io/linuxserver/duckdns:latest'
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: duckdns_network
|
@ -1,90 +0,0 @@
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Docker-compose file for Fail2ban ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
---
|
||||
version: "2"
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Sources utilisées pour personnaliser ce fichier et ceux dans les sous-dossiers ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## https://www.linode.com/docs/guides/using-fail2ban-to-secure-your-server-a-tutorial/ ##
|
||||
## https://www.linuxtricks.fr/wiki/print.php?id=40 ##
|
||||
## https://github.com/dani-garcia/bitwarden_rs/wiki/Fail2Ban-Setup#synology-dsm ##
|
||||
## https://github.com/sosandroid/docker-fail2ban-synology ##
|
||||
## ##
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
## ##
|
||||
## Cloner/télécharger le dépôt suivant qui contient les fichiers à utiliser : ##
|
||||
## https://github.com/sosandroid/docker-fail2ban-synology.git ##
|
||||
## Il faudra juste modifier le docker-compose.yml qui vient avec ou utiliser celui-ci. ##
|
||||
## ##
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
## ##
|
||||
## Pour supprimer une IP bannie, lancer la commande suivante : ##
|
||||
## sudo docker exec -t fail2ban fail2ban-client set bitwarden_rs unbanip xx.xx.xx.xx ##
|
||||
## ##
|
||||
## Pour Voir le log de fail2ban, lancer la commande : ##
|
||||
## cat /volume1/docker/fail2ban/fail2ban.log ##
|
||||
## ##
|
||||
## ##
|
||||
## Quelques commandes utiles : ##
|
||||
## docker exec -t fail2ban fail2ban-client status ##
|
||||
## docker exec -t fail2ban fail2ban-client status bitwarden_rs ##
|
||||
## ##
|
||||
## unbans <IP> (in all jails and database) : ##
|
||||
## docker exec -t fail2ban fail2ban-client unban <IP> ... <IP> ##
|
||||
## ##
|
||||
## docker exec -t fail2ban fail2ban-client --help ##
|
||||
## docker exec -t fail2ban fail2ban-client restart ##
|
||||
## docker exec -t fail2ban fail2ban-client reload --restart --unban --all ##
|
||||
## ##
|
||||
## flushes the logtarget if a file and reopens it. For log rotation. : ##
|
||||
## docker exec -t fail2ban fail2ban-client flushlogs ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
services:
|
||||
fail2ban:
|
||||
image: ghcr.io/crazy-max/fail2ban:latest
|
||||
container_name: fail2ban
|
||||
network_mode: host
|
||||
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- F2B_DB_PURGE_AGE=30d
|
||||
- F2B_LOG_TARGET=/data/fail2ban.log
|
||||
- F2B_LOG_LEVEL=INFO
|
||||
- F2B_IPTABLES_CHAIN=INPUT
|
||||
|
||||
# Il faut adapter ces variables à votre fournisseur d'email.
|
||||
- SSMTP_HOST=smtp.gmail.com
|
||||
- SSMTP_PORT=587 # Pour gmail : 587
|
||||
- SSMTP_HOSTNAME=Docker-Fail2ban # Ce sera le nom qui sera affiché dans les emails
|
||||
- SSMTP_USER=XXxxXX@gmail.com
|
||||
- SSMTP_PASSWORD=XXxxXX # Pensez à générer un mot de passe application si la 2FA est activée
|
||||
- SSMTP_TLS=YES # Pour gmail : YES
|
||||
- SSMTP_STARTTLS=YES # Pour gmail : YES
|
||||
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
|
||||
volumes:
|
||||
- "/volume1/docker/fail2ban:/data"
|
||||
|
||||
# Les différents chemins d'accès vers les fichiers log des services à protéger par fail2ban
|
||||
# On ajoute ro pour read-only (lecture seule)
|
||||
- "/volume1/docker/vaultwarden/vaultwarden-data:/vaultwarden:ro" # Vaultwarden
|
||||
- "/volume1/docker/gitea/data/gitea/log:/gitea:ro" # Gitea
|
||||
#- "/var/log/auth.log:/log/host_ssh_auth.log:ro" # SSH sur l'hôte (Synology)
|
||||
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- NET_RAW
|
||||
|
||||
restart: always
|
@ -1,4 +0,0 @@
|
||||
[Init]
|
||||
blocktype = DROP
|
||||
[Init?family=inet6]
|
||||
blocktype = DROP
|
@ -1,5 +0,0 @@
|
||||
# /volume1/docker/fail2ban/filter.d/gitea.conf
|
||||
|
||||
[Definition]
|
||||
failregex = .*(Failed authentication attempt|invalid credentials|Attempted access of unknown user).* from <HOST>
|
||||
ignoreregex =
|
@ -1,8 +0,0 @@
|
||||
# /volume1/docker/fail2ban/filter.d/vaultwarden-admin.conf
|
||||
|
||||
[INCLUDES]
|
||||
before = common.conf
|
||||
|
||||
[Definition]
|
||||
failregex = ^.*Invalid admin token\. IP: <ADDR>.*$
|
||||
ignoreregex =
|
@ -1,8 +0,0 @@
|
||||
# /volume1/docker/fail2ban/filter.d/vaultwarden.conf
|
||||
|
||||
[INCLUDES]
|
||||
before = common.conf
|
||||
|
||||
[Definition]
|
||||
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
|
||||
ignoreregex =
|
@ -1,964 +0,0 @@
|
||||
#
|
||||
# WARNING: heavily refactored in 0.9.0 release. Please review and
|
||||
# customize settings for your setup.
|
||||
#
|
||||
# Changes: in most of the cases you should not modify this
|
||||
# file, but provide customizations in jail.local file,
|
||||
# or separate .conf files under jail.d/ directory, e.g.:
|
||||
#
|
||||
# HOW TO ACTIVATE JAILS:
|
||||
#
|
||||
# YOU SHOULD NOT MODIFY THIS FILE.
|
||||
#
|
||||
# It will probably be overwritten or improved in a distribution update.
|
||||
#
|
||||
# Provide customizations in a jail.local file or a jail.d/customisation.local.
|
||||
# For example to change the default bantime for all jails and to enable the
|
||||
# ssh-iptables jail the following (uncommented) would appear in the .local file.
|
||||
# See man 5 jail.conf for details.
|
||||
#
|
||||
# [DEFAULT]
|
||||
# bantime = 1h
|
||||
#
|
||||
# [sshd]
|
||||
# enabled = true
|
||||
#
|
||||
# See jail.conf(5) man page for more information
|
||||
|
||||
|
||||
|
||||
# Comments: use '#' for comment lines and ';' (following a space) for inline comments
|
||||
|
||||
|
||||
[INCLUDES]
|
||||
|
||||
#before = paths-distro.conf
|
||||
before = paths-debian.conf
|
||||
|
||||
# The DEFAULT allows a global definition of the options. They can be overridden
|
||||
# in each jail afterwards.
|
||||
|
||||
[DEFAULT]
|
||||
|
||||
#
|
||||
# MISCELLANEOUS OPTIONS
|
||||
#
|
||||
|
||||
# "bantime.increment" allows to use database for searching of previously banned ip's to increase a
|
||||
# default ban time using special formula, default it is banTime * 1, 2, 4, 8, 16, 32...
|
||||
#bantime.increment = true
|
||||
|
||||
# "bantime.rndtime" is the max number of seconds using for mixing with random time
|
||||
# to prevent "clever" botnets calculate exact time IP can be unbanned again:
|
||||
#bantime.rndtime =
|
||||
|
||||
# "bantime.maxtime" is the max number of seconds using the ban time can reach (doesn't grow further)
|
||||
#bantime.maxtime =
|
||||
|
||||
# "bantime.factor" is a coefficient to calculate exponent growing of the formula or common multiplier,
|
||||
# default value of factor is 1 and with default value of formula, the ban time
|
||||
# grows by 1, 2, 4, 8, 16 ...
|
||||
#bantime.factor = 1
|
||||
|
||||
# "bantime.formula" used by default to calculate next value of ban time, default value below,
|
||||
# the same ban time growing will be reached by multipliers 1, 2, 4, 8, 16, 32...
|
||||
#bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor
|
||||
#
|
||||
# more aggressive example of formula has the same values only for factor "2.0 / 2.885385" :
|
||||
#bantime.formula = ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)
|
||||
|
||||
# "bantime.multipliers" used to calculate next value of ban time instead of formula, coresponding
|
||||
# previously ban count and given "bantime.factor" (for multipliers default is 1);
|
||||
# following example grows ban time by 1, 2, 4, 8, 16 ... and if last ban count greater as multipliers count,
|
||||
# always used last multiplier (64 in example), for factor '1' and original ban time 600 - 10.6 hours
|
||||
#bantime.multipliers = 1 2 4 8 16 32 64
|
||||
# following example can be used for small initial ban time (bantime=60) - it grows more aggressive at begin,
|
||||
# for bantime=60 the multipliers are minutes and equal: 1 min, 5 min, 30 min, 1 hour, 5 hour, 12 hour, 1 day, 2 day
|
||||
#bantime.multipliers = 1 5 30 60 300 720 1440 2880
|
||||
|
||||
# "bantime.overalljails" (if true) specifies the search of IP in the database will be executed
|
||||
# cross over all jails, if false (dafault), only current jail of the ban IP will be searched
|
||||
#bantime.overalljails = false
|
||||
|
||||
# --------------------
|
||||
|
||||
# "ignoreself" specifies whether the local resp. own IP addresses should be ignored
|
||||
# (default is true). Fail2ban will not ban a host which matches such addresses.
|
||||
#ignoreself = true
|
||||
|
||||
# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
|
||||
# will not ban a host which matches an address in this list. Several addresses
|
||||
# can be defined using space (and/or comma) separator.
|
||||
#ignoreip = 127.0.0.1/8 ::1
|
||||
|
||||
# External command that will take an tagged arguments to ignore, e.g. <ip>,
|
||||
# and return true if the IP is to be ignored. False otherwise.
|
||||
#
|
||||
# ignorecommand = /path/to/command <ip>
|
||||
ignorecommand =
|
||||
|
||||
# "bantime" is the number of seconds that a host is banned.
|
||||
bantime = 10m
|
||||
|
||||
# A host is banned if it has generated "maxretry" during the last "findtime"
|
||||
# seconds.
|
||||
findtime = 10m
|
||||
|
||||
# "maxretry" is the number of failures before a host get banned.
|
||||
maxretry = 5
|
||||
|
||||
# "maxmatches" is the number of matches stored in ticket (resolvable via tag <matches> in actions).
|
||||
maxmatches = %(maxretry)s
|
||||
|
||||
# "backend" specifies the backend used to get files modification.
|
||||
# Available options are "pyinotify", "gamin", "polling", "systemd" and "auto".
|
||||
# This option can be overridden in each jail as well.
|
||||
#
|
||||
# pyinotify: requires pyinotify (a file alteration monitor) to be installed.
|
||||
# If pyinotify is not installed, Fail2ban will use auto.
|
||||
# gamin: requires Gamin (a file alteration monitor) to be installed.
|
||||
# If Gamin is not installed, Fail2ban will use auto.
|
||||
# polling: uses a polling algorithm which does not require external libraries.
|
||||
# systemd: uses systemd python library to access the systemd journal.
|
||||
# Specifying "logpath" is not valid for this backend.
|
||||
# See "journalmatch" in the jails associated filter config
|
||||
# auto: will try to use the following backends, in order:
|
||||
# pyinotify, gamin, polling.
|
||||
#
|
||||
# Note: if systemd backend is chosen as the default but you enable a jail
|
||||
# for which logs are present only in its own log files, specify some other
|
||||
# backend for that jail (e.g. polling) and provide empty value for
|
||||
# journalmatch. See https://github.com/fail2ban/fail2ban/issues/959#issuecomment-74901200
|
||||
backend = auto
|
||||
|
||||
# "usedns" specifies if jails should trust hostnames in logs,
|
||||
# warn when DNS lookups are performed, or ignore all hostnames in logs
|
||||
#
|
||||
# yes: if a hostname is encountered, a DNS lookup will be performed.
|
||||
# warn: if a hostname is encountered, a DNS lookup will be performed,
|
||||
# but it will be logged as a warning.
|
||||
# no: if a hostname is encountered, will not be used for banning,
|
||||
# but it will be logged as info.
|
||||
# raw: use raw value (no hostname), allow use it for no-host filters/actions (example user)
|
||||
usedns = warn
|
||||
|
||||
# "logencoding" specifies the encoding of the log files handled by the jail
|
||||
# This is used to decode the lines from the log file.
|
||||
# Typical examples: "ascii", "utf-8"
|
||||
#
|
||||
# auto: will use the system locale setting
|
||||
logencoding = auto
|
||||
|
||||
# "enabled" enables the jails.
|
||||
# By default all jails are disabled, and it should stay this way.
|
||||
# Enable only relevant to your setup jails in your .local or jail.d/*.conf
|
||||
#
|
||||
# true: jail will be enabled and log files will get monitored for changes
|
||||
# false: jail is not enabled
|
||||
enabled = false
|
||||
|
||||
|
||||
# "mode" defines the mode of the filter (see corresponding filter implementation for more info).
|
||||
mode = normal
|
||||
|
||||
# "filter" defines the filter to use by the jail.
|
||||
# By default jails have names matching their filter name
|
||||
#
|
||||
filter = %(__name__)s[mode=%(mode)s]
|
||||
|
||||
|
||||
#
|
||||
# ACTIONS
|
||||
#
|
||||
|
||||
# Some options used for actions
|
||||
|
||||
# Destination email address used solely for the interpolations in
|
||||
# jail.{conf,local,d/*} configuration files.
|
||||
destemail = root@localhost
|
||||
|
||||
# Sender email address used solely for some actions
|
||||
sender = root@<fq-hostname>
|
||||
|
||||
# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
|
||||
# mailing. Change mta configuration parameter to mail if you want to
|
||||
# revert to conventional 'mail'.
|
||||
mta = sendmail
|
||||
|
||||
# Default protocol
|
||||
protocol = tcp
|
||||
|
||||
# Specify chain where jumps would need to be added in ban-actions expecting parameter chain
|
||||
chain = <known/chain>
|
||||
|
||||
# Ports to be banned
|
||||
# Usually should be overridden in a particular jail
|
||||
port = 0:65535
|
||||
|
||||
# Format of user-agent https://tools.ietf.org/html/rfc7231#section-5.5.3
|
||||
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
|
||||
|
||||
#
|
||||
# Action shortcuts. To be used to define action parameter
|
||||
|
||||
# Default banning action (e.g. iptables, iptables-new,
|
||||
# iptables-multiport, shorewall, etc) It is used to define
|
||||
# action_* variables. Can be overridden globally or per
|
||||
# section within jail.local file
|
||||
banaction = iptables-multiport
|
||||
banaction_allports = iptables-allports
|
||||
|
||||
# The simplest action to take: ban only
|
||||
action_ = %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
|
||||
|
||||
# ban & send an e-mail with whois report to the destemail.
|
||||
action_mw = %(action_)s
|
||||
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
|
||||
|
||||
# ban & send an e-mail with whois report and relevant log lines
|
||||
# to the destemail.
|
||||
action_mwl = %(action_)s
|
||||
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
|
||||
|
||||
# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
|
||||
#
|
||||
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
|
||||
# to the destemail.
|
||||
action_xarf = %(action_)s
|
||||
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
|
||||
|
||||
# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
|
||||
# to the destemail.
|
||||
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
|
||||
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
|
||||
|
||||
# Report block via blocklist.de fail2ban reporting service API
|
||||
#
|
||||
# See the IMPORTANT note in action.d/blocklist_de.conf for when to use this action.
|
||||
# Specify expected parameters in file action.d/blocklist_de.local or if the interpolation
|
||||
# `action_blocklist_de` used for the action, set value of `blocklist_de_apikey`
|
||||
# in your `jail.local` globally (section [DEFAULT]) or per specific jail section (resp. in
|
||||
# corresponding jail.d/my-jail.local file).
|
||||
#
|
||||
action_blocklist_de = blocklist_de[email="%(sender)s", service="%(__name__)s", apikey="%(blocklist_de_apikey)s", agent="%(fail2ban_agent)s"]
|
||||
|
||||
# Report ban via badips.com, and use as blacklist
|
||||
#
|
||||
# See BadIPsAction docstring in config/action.d/badips.py for
|
||||
# documentation for this action.
|
||||
#
|
||||
# NOTE: This action relies on banaction being present on start and therefore
|
||||
# should be last action defined for a jail.
|
||||
#
|
||||
action_badips = badips.py[category="%(__name__)s", banaction="%(banaction)s", agent="%(fail2ban_agent)s"]
|
||||
#
|
||||
# Report ban via badips.com (uses action.d/badips.conf for reporting only)
|
||||
#
|
||||
action_badips_report = badips[category="%(__name__)s", agent="%(fail2ban_agent)s"]
|
||||
|
||||
# Report ban via abuseipdb.com.
|
||||
#
|
||||
# See action.d/abuseipdb.conf for usage example and details.
|
||||
#
|
||||
action_abuseipdb = abuseipdb
|
||||
|
||||
# Choose default action. To change, just override value of 'action' with the
|
||||
# interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in jail.local
|
||||
# globally (section [DEFAULT]) or per specific section
|
||||
action = %(action_)s
|
||||
|
||||
|
||||
#
|
||||
# JAILS
|
||||
#
|
||||
|
||||
#
|
||||
# SSH servers
|
||||
#
|
||||
|
||||
[sshd]
|
||||
|
||||
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
|
||||
# normal (default), ddos, extra or aggressive (combines all).
|
||||
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
|
||||
#mode = normal
|
||||
port = ssh
|
||||
logpath = %(sshd_log)s
|
||||
backend = %(sshd_backend)s
|
||||
|
||||
|
||||
[dropbear]
|
||||
|
||||
port = ssh
|
||||
logpath = %(dropbear_log)s
|
||||
backend = %(dropbear_backend)s
|
||||
|
||||
|
||||
[selinux-ssh]
|
||||
|
||||
port = ssh
|
||||
logpath = %(auditd_log)s
|
||||
|
||||
|
||||
#
|
||||
# HTTP servers
|
||||
#
|
||||
|
||||
[apache-auth]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
|
||||
|
||||
[apache-badbots]
|
||||
# Ban hosts which agent identifies spammer robots crawling the web
|
||||
# for email addresses. The mail outputs are buffered.
|
||||
port = http,https
|
||||
logpath = %(apache_access_log)s
|
||||
bantime = 48h
|
||||
maxretry = 1
|
||||
|
||||
|
||||
[apache-noscript]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
|
||||
|
||||
[apache-overflows]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
maxretry = 2
|
||||
|
||||
|
||||
[apache-nohome]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
maxretry = 2
|
||||
|
||||
|
||||
[apache-botsearch]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
maxretry = 2
|
||||
|
||||
|
||||
[apache-fakegooglebot]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_access_log)s
|
||||
maxretry = 1
|
||||
ignorecommand = %(ignorecommands_dir)s/apache-fakegooglebot <ip>
|
||||
|
||||
|
||||
[apache-modsecurity]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
maxretry = 2
|
||||
|
||||
|
||||
[apache-shellshock]
|
||||
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
maxretry = 1
|
||||
|
||||
|
||||
[openhab-auth]
|
||||
|
||||
filter = openhab
|
||||
banaction = %(banaction_allports)s
|
||||
logpath = /opt/openhab/logs/request.log
|
||||
|
||||
|
||||
[nginx-http-auth]
|
||||
|
||||
port = http,https
|
||||
logpath = %(nginx_error_log)s
|
||||
|
||||
# To use 'nginx-limit-req' jail you should have `ngx_http_limit_req_module`
|
||||
# and define `limit_req` and `limit_req_zone` as described in nginx documentation
|
||||
# http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
|
||||
# or for example see in 'config/filter.d/nginx-limit-req.conf'
|
||||
[nginx-limit-req]
|
||||
port = http,https
|
||||
logpath = %(nginx_error_log)s
|
||||
|
||||
[nginx-botsearch]
|
||||
|
||||
port = http,https
|
||||
logpath = %(nginx_error_log)s
|
||||
maxretry = 2
|
||||
|
||||
|
||||
# Ban attackers that try to use PHP's URL-fopen() functionality
|
||||
# through GET/POST variables. - Experimental, with more than a year
|
||||
# of usage in production environments.
|
||||
|
||||
[php-url-fopen]
|
||||
|
||||
port = http,https
|
||||
logpath = %(nginx_access_log)s
|
||||
%(apache_access_log)s
|
||||
|
||||
|
||||
[suhosin]
|
||||
|
||||
port = http,https
|
||||
logpath = %(suhosin_log)s
|
||||
|
||||
|
||||
[lighttpd-auth]
|
||||
# Same as above for Apache's mod_auth
|
||||
# It catches wrong authentifications
|
||||
port = http,https
|
||||
logpath = %(lighttpd_error_log)s
|
||||
|
||||
|
||||
#
|
||||
# Webmail and groupware servers
|
||||
#
|
||||
|
||||
[roundcube-auth]
|
||||
|
||||
port = http,https
|
||||
logpath = %(roundcube_errors_log)s
|
||||
# Use following line in your jail.local if roundcube logs to journal.
|
||||
#backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[openwebmail]
|
||||
|
||||
port = http,https
|
||||
logpath = /var/log/openwebmail.log
|
||||
|
||||
|
||||
[horde]
|
||||
|
||||
port = http,https
|
||||
logpath = /var/log/horde/horde.log
|
||||
|
||||
|
||||
[groupoffice]
|
||||
|
||||
port = http,https
|
||||
logpath = /home/groupoffice/log/info.log
|
||||
|
||||
|
||||
[sogo-auth]
|
||||
# Monitor SOGo groupware server
|
||||
# without proxy this would be:
|
||||
# port = 20000
|
||||
port = http,https
|
||||
logpath = /var/log/sogo/sogo.log
|
||||
|
||||
|
||||
[tine20]
|
||||
|
||||
logpath = /var/log/tine20/tine20.log
|
||||
port = http,https
|
||||
|
||||
|
||||
#
|
||||
# Web Applications
|
||||
#
|
||||
#
|
||||
|
||||
[drupal-auth]
|
||||
|
||||
port = http,https
|
||||
logpath = %(syslog_daemon)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
[guacamole]
|
||||
|
||||
port = http,https
|
||||
logpath = /var/log/tomcat*/catalina.out
|
||||
#logpath = /var/log/guacamole.log
|
||||
|
||||
[monit]
|
||||
#Ban clients brute-forcing the monit gui login
|
||||
port = 2812
|
||||
logpath = /var/log/monit
|
||||
/var/log/monit.log
|
||||
|
||||
|
||||
[webmin-auth]
|
||||
|
||||
port = 10000
|
||||
logpath = %(syslog_authpriv)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[froxlor-auth]
|
||||
|
||||
port = http,https
|
||||
logpath = %(syslog_authpriv)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
#
|
||||
# HTTP Proxy servers
|
||||
#
|
||||
#
|
||||
|
||||
[squid]
|
||||
|
||||
port = 80,443,3128,8080
|
||||
logpath = /var/log/squid/access.log
|
||||
|
||||
|
||||
[3proxy]
|
||||
|
||||
port = 3128
|
||||
logpath = /var/log/3proxy.log
|
||||
|
||||
|
||||
#
|
||||
# FTP servers
|
||||
#
|
||||
|
||||
|
||||
[proftpd]
|
||||
|
||||
port = ftp,ftp-data,ftps,ftps-data
|
||||
logpath = %(proftpd_log)s
|
||||
backend = %(proftpd_backend)s
|
||||
|
||||
|
||||
[pure-ftpd]
|
||||
|
||||
port = ftp,ftp-data,ftps,ftps-data
|
||||
logpath = %(pureftpd_log)s
|
||||
backend = %(pureftpd_backend)s
|
||||
|
||||
|
||||
[gssftpd]
|
||||
|
||||
port = ftp,ftp-data,ftps,ftps-data
|
||||
logpath = %(syslog_daemon)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[wuftpd]
|
||||
|
||||
port = ftp,ftp-data,ftps,ftps-data
|
||||
logpath = %(wuftpd_log)s
|
||||
backend = %(wuftpd_backend)s
|
||||
|
||||
|
||||
[vsftpd]
|
||||
# or overwrite it in jails.local to be
|
||||
# logpath = %(syslog_authpriv)s
|
||||
# if you want to rely on PAM failed login attempts
|
||||
# vsftpd's failregex should match both of those formats
|
||||
port = ftp,ftp-data,ftps,ftps-data
|
||||
logpath = %(vsftpd_log)s
|
||||
|
||||
|
||||
#
|
||||
# Mail servers
|
||||
#
|
||||
|
||||
# ASSP SMTP Proxy Jail
|
||||
[assp]
|
||||
|
||||
port = smtp,465,submission
|
||||
logpath = /root/path/to/assp/logs/maillog.txt
|
||||
|
||||
|
||||
[courier-smtp]
|
||||
|
||||
port = smtp,465,submission
|
||||
logpath = %(syslog_mail)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[postfix]
|
||||
# To use another modes set filter parameter "mode" in jail.local:
|
||||
mode = more
|
||||
port = smtp,465,submission
|
||||
logpath = %(postfix_log)s
|
||||
backend = %(postfix_backend)s
|
||||
|
||||
|
||||
[postfix-rbl]
|
||||
|
||||
filter = postfix[mode=rbl]
|
||||
port = smtp,465,submission
|
||||
logpath = %(postfix_log)s
|
||||
backend = %(postfix_backend)s
|
||||
maxretry = 1
|
||||
|
||||
|
||||
[sendmail-auth]
|
||||
|
||||
port = submission,465,smtp
|
||||
logpath = %(syslog_mail)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[sendmail-reject]
|
||||
# To use more aggressive modes set filter parameter "mode" in jail.local:
|
||||
# normal (default), extra or aggressive
|
||||
# See "tests/files/logs/sendmail-reject" or "filter.d/sendmail-reject.conf" for usage example and details.
|
||||
#mode = normal
|
||||
port = smtp,465,submission
|
||||
logpath = %(syslog_mail)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[qmail-rbl]
|
||||
|
||||
filter = qmail
|
||||
port = smtp,465,submission
|
||||
logpath = /service/qmail/log/main/current
|
||||
|
||||
|
||||
# dovecot defaults to logging to the mail syslog facility
|
||||
# but can be set by syslog_facility in the dovecot configuration.
|
||||
[dovecot]
|
||||
|
||||
port = pop3,pop3s,imap,imaps,submission,465,sieve
|
||||
logpath = %(dovecot_log)s
|
||||
backend = %(dovecot_backend)s
|
||||
|
||||
|
||||
[sieve]
|
||||
|
||||
port = smtp,465,submission
|
||||
logpath = %(dovecot_log)s
|
||||
backend = %(dovecot_backend)s
|
||||
|
||||
|
||||
[solid-pop3d]
|
||||
|
||||
port = pop3,pop3s
|
||||
logpath = %(solidpop3d_log)s
|
||||
|
||||
|
||||
[exim]
|
||||
# see filter.d/exim.conf for further modes supported from filter:
|
||||
#mode = normal
|
||||
port = smtp,465,submission
|
||||
logpath = %(exim_main_log)s
|
||||
|
||||
|
||||
[exim-spam]
|
||||
|
||||
port = smtp,465,submission
|
||||
logpath = %(exim_main_log)s
|
||||
|
||||
|
||||
[kerio]
|
||||
|
||||
port = imap,smtp,imaps,465
|
||||
logpath = /opt/kerio/mailserver/store/logs/security.log
|
||||
|
||||
|
||||
#
|
||||
# Mail servers authenticators: might be used for smtp,ftp,imap servers, so
|
||||
# all relevant ports get banned
|
||||
#
|
||||
|
||||
[courier-auth]
|
||||
|
||||
port = smtp,465,submission,imap,imaps,pop3,pop3s
|
||||
logpath = %(syslog_mail)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[postfix-sasl]
|
||||
|
||||
filter = postfix[mode=auth]
|
||||
port = smtp,465,submission,imap,imaps,pop3,pop3s
|
||||
# You might consider monitoring /var/log/mail.warn instead if you are
|
||||
# running postfix since it would provide the same log lines at the
|
||||
# "warn" level but overall at the smaller filesize.
|
||||
logpath = %(postfix_log)s
|
||||
backend = %(postfix_backend)s
|
||||
|
||||
|
||||
[perdition]
|
||||
|
||||
port = imap,imaps,pop3,pop3s
|
||||
logpath = %(syslog_mail)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[squirrelmail]
|
||||
|
||||
port = smtp,465,submission,imap,imap2,imaps,pop3,pop3s,http,https,socks
|
||||
logpath = /var/lib/squirrelmail/prefs/squirrelmail_access_log
|
||||
|
||||
|
||||
[cyrus-imap]
|
||||
|
||||
port = imap,imaps
|
||||
logpath = %(syslog_mail)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[uwimap-auth]
|
||||
|
||||
port = imap,imaps
|
||||
logpath = %(syslog_mail)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
# DNS servers
|
||||
#
|
||||
|
||||
|
||||
# !!! WARNING !!!
|
||||
# Since UDP is connection-less protocol, spoofing of IP and imitation
|
||||
# of illegal actions is way too simple. Thus enabling of this filter
|
||||
# might provide an easy way for implementing a DoS against a chosen
|
||||
# victim. See
|
||||
# http://nion.modprobe.de/blog/archives/690-fail2ban-+-dns-fail.html
|
||||
# Please DO NOT USE this jail unless you know what you are doing.
|
||||
#
|
||||
# IMPORTANT: see filter.d/named-refused for instructions to enable logging
|
||||
# This jail blocks UDP traffic for DNS requests.
|
||||
# [named-refused-udp]
|
||||
#
|
||||
# filter = named-refused
|
||||
# port = domain,953
|
||||
# protocol = udp
|
||||
# logpath = /var/log/named/security.log
|
||||
|
||||
# IMPORTANT: see filter.d/named-refused for instructions to enable logging
|
||||
# This jail blocks TCP traffic for DNS requests.
|
||||
|
||||
[named-refused]
|
||||
|
||||
port = domain,953
|
||||
logpath = /var/log/named/security.log
|
||||
|
||||
|
||||
[nsd]
|
||||
|
||||
port = 53
|
||||
action_ = %(default/action_)s[name=%(__name__)s-tcp, protocol="tcp"]
|
||||
%(default/action_)s[name=%(__name__)s-udp, protocol="udp"]
|
||||
logpath = /var/log/nsd.log
|
||||
|
||||
|
||||
#
|
||||
# Miscellaneous
|
||||
#
|
||||
|
||||
[asterisk]
|
||||
|
||||
port = 5060,5061
|
||||
action_ = %(default/action_)s[name=%(__name__)s-tcp, protocol="tcp"]
|
||||
%(default/action_)s[name=%(__name__)s-udp, protocol="udp"]
|
||||
logpath = /var/log/asterisk/messages
|
||||
maxretry = 10
|
||||
|
||||
|
||||
[freeswitch]
|
||||
|
||||
port = 5060,5061
|
||||
action_ = %(default/action_)s[name=%(__name__)s-tcp, protocol="tcp"]
|
||||
%(default/action_)s[name=%(__name__)s-udp, protocol="udp"]
|
||||
logpath = /var/log/freeswitch.log
|
||||
maxretry = 10
|
||||
|
||||
|
||||
# enable adminlog; it will log to a file inside znc's directory by default.
|
||||
[znc-adminlog]
|
||||
|
||||
port = 6667
|
||||
logpath = /var/lib/znc/moddata/adminlog/znc.log
|
||||
|
||||
|
||||
# To log wrong MySQL access attempts add to /etc/my.cnf in [mysqld] or
|
||||
# equivalent section:
|
||||
# log-warnings = 2
|
||||
#
|
||||
# for syslog (daemon facility)
|
||||
# [mysqld_safe]
|
||||
# syslog
|
||||
#
|
||||
# for own logfile
|
||||
# [mysqld]
|
||||
# log-error=/var/log/mysqld.log
|
||||
[mysqld-auth]
|
||||
|
||||
port = 3306
|
||||
logpath = %(mysql_log)s
|
||||
backend = %(mysql_backend)s
|
||||
|
||||
|
||||
# Log wrong MongoDB auth (for details see filter 'filter.d/mongodb-auth.conf')
|
||||
[mongodb-auth]
|
||||
# change port when running with "--shardsvr" or "--configsvr" runtime operation
|
||||
port = 27017
|
||||
logpath = /var/log/mongodb/mongodb.log
|
||||
|
||||
|
||||
# Jail for more extended banning of persistent abusers
|
||||
# !!! WARNINGS !!!
|
||||
# 1. Make sure that your loglevel specified in fail2ban.conf/.local
|
||||
# is not at DEBUG level -- which might then cause fail2ban to fall into
|
||||
# an infinite loop constantly feeding itself with non-informative lines
|
||||
# 2. Increase dbpurgeage defined in fail2ban.conf to e.g. 648000 (7.5 days)
|
||||
# to maintain entries for failed logins for sufficient amount of time
|
||||
[recidive]
|
||||
|
||||
logpath = /var/log/fail2ban.log
|
||||
banaction = %(banaction_allports)s
|
||||
bantime = 1w
|
||||
findtime = 1d
|
||||
|
||||
|
||||
# Generic filter for PAM. Has to be used with action which bans all
|
||||
# ports such as iptables-allports, shorewall
|
||||
|
||||
[pam-generic]
|
||||
# pam-generic filter can be customized to monitor specific subset of 'tty's
|
||||
banaction = %(banaction_allports)s
|
||||
logpath = %(syslog_authpriv)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[xinetd-fail]
|
||||
|
||||
banaction = iptables-multiport-log
|
||||
logpath = %(syslog_daemon)s
|
||||
backend = %(syslog_backend)s
|
||||
maxretry = 2
|
||||
|
||||
|
||||
# stunnel - need to set port for this
|
||||
[stunnel]
|
||||
|
||||
logpath = /var/log/stunnel4/stunnel.log
|
||||
|
||||
|
||||
[ejabberd-auth]
|
||||
|
||||
port = 5222
|
||||
logpath = /var/log/ejabberd/ejabberd.log
|
||||
|
||||
|
||||
[counter-strike]
|
||||
|
||||
logpath = /opt/cstrike/logs/L[0-9]*.log
|
||||
tcpport = 27030,27031,27032,27033,27034,27035,27036,27037,27038,27039
|
||||
udpport = 1200,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015
|
||||
action_ = %(default/action_)s[name=%(__name__)s-tcp, port="%(tcpport)s", protocol="tcp"]
|
||||
%(default/action_)s[name=%(__name__)s-udp, port="%(udpport)s", protocol="udp"]
|
||||
|
||||
[softethervpn]
|
||||
port = 500,4500
|
||||
protocol = udp
|
||||
logpath = /usr/local/vpnserver/security_log/*/sec.log
|
||||
|
||||
[gitlab]
|
||||
port = http,https
|
||||
logpath = /var/log/gitlab/gitlab-rails/application.log
|
||||
|
||||
[grafana]
|
||||
port = http,https
|
||||
logpath = /var/log/grafana/grafana.log
|
||||
|
||||
[bitwarden]
|
||||
port = http,https
|
||||
logpath = /home/*/bwdata/logs/identity/Identity/log.txt
|
||||
|
||||
[centreon]
|
||||
port = http,https
|
||||
logpath = /var/log/centreon/login.log
|
||||
|
||||
# consider low maxretry and a long bantime
|
||||
# nobody except your own Nagios server should ever probe nrpe
|
||||
[nagios]
|
||||
|
||||
logpath = %(syslog_daemon)s ; nrpe.cfg may define a different log_facility
|
||||
backend = %(syslog_backend)s
|
||||
maxretry = 1
|
||||
|
||||
|
||||
[oracleims]
|
||||
# see "oracleims" filter file for configuration requirement for Oracle IMS v6 and above
|
||||
logpath = /opt/sun/comms/messaging64/log/mail.log_current
|
||||
banaction = %(banaction_allports)s
|
||||
|
||||
[directadmin]
|
||||
logpath = /var/log/directadmin/login.log
|
||||
port = 2222
|
||||
|
||||
[portsentry]
|
||||
logpath = /var/lib/portsentry/portsentry.history
|
||||
maxretry = 1
|
||||
|
||||
[pass2allow-ftp]
|
||||
# this pass2allow example allows FTP traffic after successful HTTP authentication
|
||||
port = ftp,ftp-data,ftps,ftps-data
|
||||
# knocking_url variable must be overridden to some secret value in jail.local
|
||||
knocking_url = /knocking/
|
||||
filter = apache-pass[knocking_url="%(knocking_url)s"]
|
||||
# access log of the website with HTTP auth
|
||||
logpath = %(apache_access_log)s
|
||||
blocktype = RETURN
|
||||
returntype = DROP
|
||||
action = %(action_)s[blocktype=%(blocktype)s, returntype=%(returntype)s,
|
||||
actionstart_on_demand=false, actionrepair_on_unban=true]
|
||||
bantime = 1h
|
||||
maxretry = 1
|
||||
findtime = 1
|
||||
|
||||
|
||||
[murmur]
|
||||
# AKA mumble-server
|
||||
port = 64738
|
||||
action_ = %(default/action_)s[name=%(__name__)s-tcp, protocol="tcp"]
|
||||
%(default/action_)s[name=%(__name__)s-udp, protocol="udp"]
|
||||
logpath = /var/log/mumble-server/mumble-server.log
|
||||
|
||||
|
||||
[screensharingd]
|
||||
# For Mac OS Screen Sharing Service (VNC)
|
||||
logpath = /var/log/system.log
|
||||
logencoding = utf-8
|
||||
|
||||
[haproxy-http-auth]
|
||||
# HAProxy by default doesn't log to file you'll need to set it up to forward
|
||||
# logs to a syslog server which would then write them to disk.
|
||||
# See "haproxy-http-auth" filter for a brief cautionary note when setting
|
||||
# maxretry and findtime.
|
||||
logpath = /var/log/haproxy.log
|
||||
|
||||
[slapd]
|
||||
port = ldap,ldaps
|
||||
logpath = /var/log/slapd.log
|
||||
|
||||
[domino-smtp]
|
||||
port = smtp,ssmtp
|
||||
logpath = /home/domino01/data/IBM_TECHNICAL_SUPPORT/console.log
|
||||
|
||||
[phpmyadmin-syslog]
|
||||
port = http,https
|
||||
logpath = %(syslog_authpriv)s
|
||||
backend = %(syslog_backend)s
|
||||
|
||||
|
||||
[zoneminder]
|
||||
# Zoneminder HTTP/HTTPS web interface auth
|
||||
# Logs auth failures to apache2 error log
|
||||
port = http,https
|
||||
logpath = %(apache_error_log)s
|
||||
|
||||
[traefik-auth]
|
||||
# to use 'traefik-auth' filter you have to configure your Traefik instance,
|
||||
# see `filter.d/traefik-auth.conf` for details and service example.
|
||||
port = http,https
|
||||
logpath = /var/log/traefik/access.log
|
@ -1,39 +0,0 @@
|
||||
# /volume1/docker/fail2ban/jail.d/gitea.conf
|
||||
|
||||
[DEFAULT]
|
||||
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
|
||||
# ban a host which matches an address in this list. Several addresses can be
|
||||
# defined using space separator.
|
||||
ignoreip = 172.16.0.0/12 192.168.0.0/16 10.0.0.0/8
|
||||
|
||||
# Changes the default ban action from "iptables-multiport", which causes issues on some platforms, to "iptables-allports".
|
||||
banaction = iptables-allports
|
||||
|
||||
# "bantime" is the number of seconds that a host is banned.
|
||||
bantime = 600
|
||||
|
||||
# A host is banned if it has generated "maxretry" during the last "findtime"
|
||||
# seconds.
|
||||
findtime = 600
|
||||
|
||||
# "maxretry" is the number of failures before a host get banned.
|
||||
maxretry = 5
|
||||
|
||||
destemail = email@gmail.com
|
||||
sender = email@gmail.com
|
||||
sendername = Fail2Ban
|
||||
action = %(action_mwl)s
|
||||
|
||||
backend = auto
|
||||
|
||||
|
||||
[gitea]
|
||||
enabled = true
|
||||
|
||||
# Doit correspondre au nom du fichier .conf dans le dossier filter.d
|
||||
filter = gitea
|
||||
|
||||
logpath = /gitea/gitea.log
|
||||
maxretry = 10
|
||||
findtime = 3600
|
||||
bantime = 900
|
@ -1,37 +0,0 @@
|
||||
# /volume1/docker/fail2ban/jail.d/vaultwarden-admin.conf
|
||||
|
||||
[DEFAULT]
|
||||
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
|
||||
# ban a host which matches an address in this list. Several addresses can be
|
||||
# defined using space separator.
|
||||
ignoreip = 172.16.0.0/12 192.168.0.0/16 10.0.0.0/8
|
||||
|
||||
# Changes the default ban action from "iptables-multiport", which causes issues on some platforms, to "iptables-allports".
|
||||
banaction = iptables-allports
|
||||
|
||||
# "bantime" is the number of seconds that a host is banned.
|
||||
bantime = 600
|
||||
|
||||
# A host is banned if it has generated "maxretry" during the last "findtime"
|
||||
# seconds.
|
||||
findtime = 600
|
||||
|
||||
# "maxretry" is the number of failures before a host get banned.
|
||||
maxretry = 5
|
||||
|
||||
destemail = email@gmail.com
|
||||
sender = email@gmail.com
|
||||
sendername = Fail2Ban
|
||||
action = %(action_mwl)s
|
||||
|
||||
backend = auto
|
||||
|
||||
|
||||
[vaultwarden-admin]
|
||||
enabled = true
|
||||
port = 882,3012
|
||||
|
||||
# Doit correspondre au nom du fichier .conf dans le dossier filter.d
|
||||
filter = vaultwarden-admin
|
||||
|
||||
logpath = /vaultwarden/vaultwarden.log
|
@ -1,37 +0,0 @@
|
||||
# /volume1/docker/fail2ban/jail.d/vaultwarden.conf
|
||||
|
||||
[DEFAULT]
|
||||
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
|
||||
# ban a host which matches an address in this list. Several addresses can be
|
||||
# defined using space separator.
|
||||
ignoreip = 172.16.0.0/12 192.168.0.0/16 10.0.0.0/8
|
||||
|
||||
# Changes the default ban action from "iptables-multiport", which causes issues on some platforms, to "iptables-allports".
|
||||
banaction = iptables-allports
|
||||
|
||||
# "bantime" is the number of seconds that a host is banned.
|
||||
bantime = 600
|
||||
|
||||
# A host is banned if it has generated "maxretry" during the last "findtime"
|
||||
# seconds.
|
||||
findtime = 600
|
||||
|
||||
# "maxretry" is the number of failures before a host get banned.
|
||||
maxretry = 5
|
||||
|
||||
destemail = email@gmail.com
|
||||
sender = email@gmail.com
|
||||
sendername = Fail2Ban
|
||||
action = %(action_mwl)s
|
||||
|
||||
backend = auto
|
||||
|
||||
|
||||
[vaultwarden]
|
||||
enabled = true
|
||||
port = 882,3012
|
||||
|
||||
# Doit correspondre au nom du fichier .conf dans le dossier filter.d
|
||||
filter = vaultwarden
|
||||
|
||||
logpath = /vaultwarden/vaultwarden.log
|
@ -1,26 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-04-20
|
||||
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
ghost:
|
||||
container_name: ghost
|
||||
image: ghost:4-alpine
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
networks:
|
||||
- ghost-network
|
||||
restart: always
|
||||
ports:
|
||||
- 2368:2368
|
||||
volumes:
|
||||
- /mnt/volume1/docker/ghost/content:/var/lib/ghost/content
|
||||
environment:
|
||||
url : http://192.168.1.10:2368
|
||||
|
||||
networks:
|
||||
ghost-network:
|
||||
external:
|
||||
name: ghost-network
|
@ -1,171 +0,0 @@
|
||||
Changer le thème de Gitea <!-- omit in toc -->
|
||||
============
|
||||
---
|
||||
> :pencil2: **Mise à jour :** Ajout de la possibilité de changer le style dans le menu `Configuration / Comptes / Sélectionner le thème par défaut` pour les thèmes Gitea de [theme.park](https://github.com/gilbN/theme.park/wiki/Gitea). <br>
|
||||
*Voir* [§ 2. Ajouter les différents thèmes en laissant le choix à l'utilisateur](#2-ajouter-les-différents-thèmes-en-laissant-le-choix-à-l-utilisateur)
|
||||
---
|
||||
|
||||
:arrow_forward: Vous pouvez trouver quelques thèmes ici : https://gitea.com/gitea/awesome-gitea#themes
|
||||
|
||||
:book: Dans la suite de ce tuto, on ne parlera que des thèmes Gitea de [theme.park](https://github.com/gilbN/theme.park/wiki/Gitea).
|
||||
|
||||
## Table des matières <!-- omit in toc -->
|
||||
- [1. Modifier le thème sans laisser le choix à l'utilisateur](#1-modifier-le-thème-sans-laisser-le-choix-à-l-utilisateur)
|
||||
- [1.1. Installer le thème](#1-1-installer-le-thème)
|
||||
- [1.2. Exemple avec le dernier lien du dépôt donnée précédemment](#1-2-exemple-avec-le-dernier-lien-du-dépôt-donnée-précédemment)
|
||||
- [1.2.1. Installer le thème (imposé pour tous)](#1-2-1-installer-le-thème-imposé-pour-tous)
|
||||
- [1.2.2. Changer le thème](#1-2-2-changer-le-thème)
|
||||
- [2. Ajouter les différents thèmes en laissant le choix à l'utilisateur](#2-ajouter-les-différents-thèmes-en-laissant-le-choix-à-l-utilisateur)
|
||||
- [2.1. Création des dossiers dans `/volume1/docker/gitea/data/`](#2-1-création-des-dossiers-dans-volume1-docker-gitea-data)
|
||||
- [2.2. Télécharger les différents css](#2-2-télécharger-les-différents-css)
|
||||
- [2.3. Création du fichier `header.tmpl`](#2-3-création-du-fichier-header-tmpl)
|
||||
- [2.4. Modification du fichier `/data/gitea/conf/app.ini`](#2-4-modification-du-fichier-data-gitea-conf-app-ini)
|
||||
- [2.4.1. Point info sur la modification de ce fichier](#2-4-1-point-info-sur-la-modification-de-ce-fichier)
|
||||
- [2.4.2. Ce qu'il faut ajouter au fichier `/data/gitea/conf/app.ini`](#2-4-2-ce-qu-il-faut-ajouter-au-fichier-data-gitea-conf-app-ini)
|
||||
- [2.4.3. Redémarrer le conteneur](#2-4-3-redémarrer-le-conteneur)
|
||||
- [2.5. Choisir son thème dans l'interface graphique de Gitea](#2-5-choisir-son-thème-dans-l-interface-graphique-de-gitea)
|
||||
|
||||
# 1. Modifier le thème sans laisser le choix à l'utilisateur
|
||||
|
||||
## 1.1. Installer le thème
|
||||
|
||||
Il faut vérifier si la variable GITEA_CUSTOM a été paramétrée. En temps normal, ce n'est pas le cas.
|
||||
|
||||
Si ce n'est pas le cas, on peut aller vérifier le chemin qui est paramétré pour le dossier dit CUSTOM de gitea. Pour celà, il faut aller ici : <br>
|
||||
`https://url-de-votre-gitea.tlds/admin/config`
|
||||
|
||||
Puis chercher la ligne `GITEA_CUSTOM` où apparaîtra le chemin d'accès : `/data/gitea`.
|
||||
|
||||
Dans le cas d'une installation Docker, ça donnerait ceci : `/docker/gitea/data/gitea`
|
||||
<br>(voir le fichier **docker-compose.yml** pour le chemin d'accès avant le `/data/gitea`)
|
||||
|
||||
Il faudra alors créer les dossiers suivants :
|
||||
|
||||
- `public`
|
||||
- `templates`
|
||||
- `templates/custom`
|
||||
|
||||
Puis il faudra suivre les instructions du thème choisi. Pour ceux qui n'auraient pas d'instructions, le fichier `styles.css` devra se trouver dans le dossier `public`.
|
||||
|
||||
## 1.2. Exemple avec le dernier lien du dépôt donnée précédemment
|
||||
|
||||
### 1.2.1. Installer le thème (imposé pour tous)
|
||||
|
||||
Je vais prendre le dernier lien présent dans le dépôt donné avant la table des matières.
|
||||
|
||||
> - [theme.park](https://github.com/gilbN/theme.park/wiki/Gitea) - A theme suite for Gitea.
|
||||
|
||||
Dans ce nouveau dépôt ( https://github.com/gilbN/theme.park/wiki/Gitea ) vous trouverez plusieurs thèmes.
|
||||
|
||||
Je trouve les thèmes plex, dark et space-gray relativement sympas.
|
||||
Des captures sont présentes plus bas dans la page : https://github.com/gilbN/theme.park/wiki/Gitea#screenshots
|
||||
|
||||
Il faut créer deux fichiers :
|
||||
|
||||
- `public/styles.css` qui contient (avec des commentaires perso) :
|
||||
```css
|
||||
/* Source : https://github.com/gilbN/theme.park/wiki/Gitea
|
||||
Possibilités : https://gilbn.github.io/theme.park/CSS/themes/gitea/XXX.css
|
||||
aquamarine.css <--- pas terrible
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP
|
||||
organizr-dark.css
|
||||
*/
|
||||
@import url("https://gilbn.github.io/theme.park/CSS/themes/gitea/plex.css");
|
||||
```
|
||||
|
||||
- `templates/custom/header.tmpl` qui contient :
|
||||
```html
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/styles.css">
|
||||
```
|
||||
Une fois les fichiers créés et placés dans ces dossiers (faire attention aux permissions), il suffit de redémarrer Gitea (ou le conteneur si installation en Docker).
|
||||
|
||||
### 1.2.2. Changer le thème
|
||||
|
||||
Pour changer le thème, il suffit de :
|
||||
|
||||
- modifier le `public/styles.css` avec le nom du css désiré ;
|
||||
- redémarrer Gitea ;
|
||||
- ne pas oublier de vider le cache du navigateur... sinon le nouveau thème ne sera pas visible... (ça m'a pris 15 minutes d'essais et au bout de ce temps l'utilisation d'un autre navigateur pour le comprendre...).
|
||||
|
||||
---
|
||||
---
|
||||
|
||||
# 2. Ajouter les différents thèmes en laissant le choix à l'utilisateur
|
||||
|
||||
> :memo: Cette partie devrait être compatible avec d'autres thèmes qui n'apportent qu'un seul fichier `.css`. ***À confirmer...***
|
||||
|
||||
## 2.1. Création des dossiers dans `/volume1/docker/gitea/data/`
|
||||
|
||||
- Il faut vérifier si la variable GITEA_CUSTOM a été paramétrée. En temps normal, ce n'est pas le cas.
|
||||
|
||||
- Si ce n'est pas le cas, on peut aller vérifier le chemin qui est paramétré pour le dossier dit CUSTOM de gitea. Pour celà, il faut aller ici :
|
||||
`https://url-de-votre-gitea.tlds/admin/config`
|
||||
|
||||
- Puis chercher la ligne `GITEA_CUSTOM` où apparaîtra le chemin d'accès : `/data/gitea`.
|
||||
|
||||
- Dans le cas d'une installation Docker, ça donnerait ceci : `/docker/gitea/data/gitea`
|
||||
<br>(voir le fichier **docker-compose.yml** pour le chemin d'accès avant le `/data/gitea`)
|
||||
|
||||
- Il faudra alors créer les dossiers suivants :
|
||||
|
||||
- `public`
|
||||
- `public/css`
|
||||
- `templates`
|
||||
- `templates/custom`
|
||||
|
||||
## 2.2. Télécharger les différents css
|
||||
|
||||
- Télécharger les différents thèmes .css ici : https://github.com/gilbN/theme.park/tree/master/CSS/themes/gitea.
|
||||
*(Ne pas les renommer.)*
|
||||
- Placer ces fichiers dans le dossier `...public/css` créé précédemment.
|
||||
|
||||
## 2.3. Création du fichier `header.tmpl`
|
||||
|
||||
- Créer le fichier `header.tmpl` et l'enregistrer dans le dossier `.../templates/custom/` créé précédemment.
|
||||
```html
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/{{DefaultTheme}}.css">
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/{{.SignedUser.Theme}}.css">
|
||||
```
|
||||
|
||||
## 2.4. Modification du fichier `/data/gitea/conf/app.ini`
|
||||
|
||||
### 2.4.1. Point info sur la modification de ce fichier
|
||||
|
||||
Pour modifier ce fichier, il se peut que vous n'ayez pas les permissions d'enregistrer les modifications apportées... Il faudra alors le copier ailleurs, faire les modifications et sauvegarder, puis re-copier dans l'autre sens le fichier dans son dossier d'origine.
|
||||
|
||||
C'est ce que je dois faire. Depuis une ligne de commande SSH, je fais :
|
||||
- Je copie le fichier dans un dossier où mon utilisateur Admin à les droits en écriture (je ne me logue pas avec l'utilisateur choisir pour Gitea) : <br>`cp /volume1/docker/gitea/data/gitea/conf/app.ini /volume1/docker/gitea/`
|
||||
- Je modifie et sauvegarde mon fichier...
|
||||
- puis je copie en retour le fichier modifier : `cp /volume1/docker/gitea/app.ini /volume1/docker/gitea/data/gitea/conf/`
|
||||
- Il faut ensuite relancer le conteneur Gitea avec Portainer/DSM ou en CLI : `docker restart gitea`
|
||||
|
||||
### 2.4.2. Ce qu'il faut ajouter au fichier `/data/gitea/conf/app.ini`
|
||||
|
||||
Il faut ajouter ceci au fichier `app.ini` :
|
||||
|
||||
```ini
|
||||
[ui]
|
||||
THEMES = gitea,arc-green,plex,aquamarine,dark,hotline,organizr-dark,space-gray
|
||||
DEFAULT_THEME = arc-green
|
||||
```
|
||||
> :memo: Note : Il se peut que la section `[ui]` soit déjà présente dans votre `app.ini`, il faudra alors modifier la ligne `THEMES`.
|
||||
|
||||
### 2.4.3. Redémarrer le conteneur
|
||||
|
||||
Il faut bien penser à redémarrer le conteneur.
|
||||
|
||||
## 2.5. Choisir son thème dans l'interface graphique de Gitea
|
||||
|
||||
![](https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/raw/branch/master/docker-compose/gitea/tuto-1.png)
|
||||
|
||||
![](https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/raw/branch/master/docker-compose/gitea/tuto-2.png)
|
||||
|
||||
![](https://gitea.zoz-serv.org/Zoz/plex_fr_discord_repo/raw/branch/master/docker-compose/gitea/tuto-3.png)
|
||||
|
||||
|
||||
---
|
||||
|
||||
Voilà, c'est la fin :D
|
@ -1,23 +0,0 @@
|
||||
/* dP dP dP */
|
||||
/* 88 88 88 */
|
||||
/* d8888P 88d888b. .d8888b. 88d8b.d8b. .d8888b. 88d888b. .d8888b. 88d888b. 88 .dP */
|
||||
/* 88 88' `88 88ooood8 88'`88'`88 88ooood8 88' `88 88' `88 88' `88 88888" */
|
||||
/* 88 88 88 88. ... 88 88 88 88. ... 88. .88 88. .88 88 88 `8b. */
|
||||
/* dP dP dP `88888P' dP dP dP `88888P' 88 88Y888P' `88888P8 dP dP `YP */
|
||||
/* 88 */
|
||||
/* dP */
|
||||
|
||||
/* Made by @gilbN */
|
||||
/* https://github.com/gilbN/theme.park */
|
||||
|
||||
/* Source : https://docs.theme-park.dev/themes/gitea/
|
||||
Possibilités : https://theme-park.dev/CSS/themes/gitea/gitea/XXX.css
|
||||
aquamarine.css <--- Pas mal celui là.
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP, mon préféré !
|
||||
organizr-dark.css
|
||||
*/
|
||||
|
||||
@import url("https://theme-park.dev/CSS/themes/gitea/aquamarine.css");
|
@ -1,23 +0,0 @@
|
||||
/* dP dP dP */
|
||||
/* 88 88 88 */
|
||||
/* d8888P 88d888b. .d8888b. 88d8b.d8b. .d8888b. 88d888b. .d8888b. 88d888b. 88 .dP */
|
||||
/* 88 88' `88 88ooood8 88'`88'`88 88ooood8 88' `88 88' `88 88' `88 88888" */
|
||||
/* 88 88 88 88. ... 88 88 88 88. ... 88. .88 88. .88 88 88 `8b. */
|
||||
/* dP dP dP `88888P' dP dP dP `88888P' 88 88Y888P' `88888P8 dP dP `YP */
|
||||
/* 88 */
|
||||
/* dP */
|
||||
|
||||
/* Made by @gilbN */
|
||||
/* https://github.com/gilbN/theme.park */
|
||||
|
||||
/* Source : https://docs.theme-park.dev/themes/gitea/
|
||||
Possibilités : https://theme-park.dev/CSS/themes/gitea/gitea/XXX.css
|
||||
aquamarine.css <--- Pas mal celui là.
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP, mon préféré !
|
||||
organizr-dark.css
|
||||
*/
|
||||
|
||||
@import url("https://theme-park.dev/CSS/themes/gitea/dark.css");
|
@ -1,23 +0,0 @@
|
||||
/* dP dP dP */
|
||||
/* 88 88 88 */
|
||||
/* d8888P 88d888b. .d8888b. 88d8b.d8b. .d8888b. 88d888b. .d8888b. 88d888b. 88 .dP */
|
||||
/* 88 88' `88 88ooood8 88'`88'`88 88ooood8 88' `88 88' `88 88' `88 88888" */
|
||||
/* 88 88 88 88. ... 88 88 88 88. ... 88. .88 88. .88 88 88 `8b. */
|
||||
/* dP dP dP `88888P' dP dP dP `88888P' 88 88Y888P' `88888P8 dP dP `YP */
|
||||
/* 88 */
|
||||
/* dP */
|
||||
|
||||
/* Made by @gilbN */
|
||||
/* https://github.com/gilbN/theme.park */
|
||||
|
||||
/* Source : https://docs.theme-park.dev/themes/gitea/
|
||||
Possibilités : https://theme-park.dev/CSS/themes/gitea/gitea/XXX.css
|
||||
aquamarine.css <--- Pas mal celui là.
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP, mon préféré !
|
||||
organizr-dark.css
|
||||
*/
|
||||
|
||||
@import url("https://theme-park.dev/CSS/themes/gitea/hotline.css");
|
@ -1,23 +0,0 @@
|
||||
/* dP dP dP */
|
||||
/* 88 88 88 */
|
||||
/* d8888P 88d888b. .d8888b. 88d8b.d8b. .d8888b. 88d888b. .d8888b. 88d888b. 88 .dP */
|
||||
/* 88 88' `88 88ooood8 88'`88'`88 88ooood8 88' `88 88' `88 88' `88 88888" */
|
||||
/* 88 88 88 88. ... 88 88 88 88. ... 88. .88 88. .88 88 88 `8b. */
|
||||
/* dP dP dP `88888P' dP dP dP `88888P' 88 88Y888P' `88888P8 dP dP `YP */
|
||||
/* 88 */
|
||||
/* dP */
|
||||
|
||||
/* Made by @gilbN */
|
||||
/* https://github.com/gilbN/theme.park */
|
||||
|
||||
/* Source : https://docs.theme-park.dev/themes/gitea/
|
||||
Possibilités : https://theme-park.dev/CSS/themes/gitea/gitea/XXX.css
|
||||
aquamarine.css <--- Pas mal celui là.
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP, mon préféré !
|
||||
organizr-dark.css
|
||||
*/
|
||||
|
||||
@import url("https://theme-park.dev/CSS/themes/gitea/organizr-dark.css");
|
@ -1,23 +0,0 @@
|
||||
/* dP dP dP */
|
||||
/* 88 88 88 */
|
||||
/* d8888P 88d888b. .d8888b. 88d8b.d8b. .d8888b. 88d888b. .d8888b. 88d888b. 88 .dP */
|
||||
/* 88 88' `88 88ooood8 88'`88'`88 88ooood8 88' `88 88' `88 88' `88 88888" */
|
||||
/* 88 88 88 88. ... 88 88 88 88. ... 88. .88 88. .88 88 88 `8b. */
|
||||
/* dP dP dP `88888P' dP dP dP `88888P' 88 88Y888P' `88888P8 dP dP `YP */
|
||||
/* 88 */
|
||||
/* dP */
|
||||
|
||||
/* Made by @gilbN */
|
||||
/* https://github.com/gilbN/theme.park */
|
||||
|
||||
/* Source : https://docs.theme-park.dev/themes/gitea/
|
||||
Possibilités : https://theme-park.dev/CSS/themes/gitea/gitea/XXX.css
|
||||
aquamarine.css <--- Pas mal celui là.
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP, mon préféré !
|
||||
organizr-dark.css
|
||||
*/
|
||||
|
||||
@import url("https://theme-park.dev/CSS/themes/gitea/plex.css");
|
@ -1,23 +0,0 @@
|
||||
/* dP dP dP */
|
||||
/* 88 88 88 */
|
||||
/* d8888P 88d888b. .d8888b. 88d8b.d8b. .d8888b. 88d888b. .d8888b. 88d888b. 88 .dP */
|
||||
/* 88 88' `88 88ooood8 88'`88'`88 88ooood8 88' `88 88' `88 88' `88 88888" */
|
||||
/* 88 88 88 88. ... 88 88 88 88. ... 88. .88 88. .88 88 88 `8b. */
|
||||
/* dP dP dP `88888P' dP dP dP `88888P' 88 88Y888P' `88888P8 dP dP `YP */
|
||||
/* 88 */
|
||||
/* dP */
|
||||
|
||||
/* Made by @gilbN */
|
||||
/* https://github.com/gilbN/theme.park */
|
||||
|
||||
/* Source : https://docs.theme-park.dev/themes/gitea/
|
||||
Possibilités : https://theme-park.dev/CSS/themes/gitea/gitea/XXX.css
|
||||
aquamarine.css <--- Pas mal celui là.
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP, mon préféré !
|
||||
organizr-dark.css
|
||||
*/
|
||||
|
||||
@import url("https://theme-park.dev/CSS/themes/gitea/space-gray.css");
|
@ -1,10 +0,0 @@
|
||||
/* Source : https://github.com/gilbN/theme.park/wiki/Gitea
|
||||
Possibilités : https://gilbn.github.io/theme.park/CSS/themes/gitea/XXX.css
|
||||
aquamarine.css <--- Pas mal celui là.
|
||||
hotline.css
|
||||
plex.css <--- TOP
|
||||
dark.css <--- TOP
|
||||
space-gray.css <--- TOP, mon préféré !
|
||||
organizr-dark.css
|
||||
*/
|
||||
@import url("https://gilbn.github.io/theme.park/CSS/themes/gitea/space-gray.css");
|
@ -1,6 +0,0 @@
|
||||
<!--
|
||||
// Copie de la méthode d'installation qui ne laisse aucun choix à l'utilisateur
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/styles.css">
|
||||
-->
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/{{DefaultTheme}}.css">
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/{{.SignedUser.Theme}}.css">
|
@ -1,94 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-04-19
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Fichier docker-compose.yml pour Gitea ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Pour que Gitea fonctionne correctement et que l'on puisse faire des git clone depuis ##
|
||||
## un ordinateur, il faut un nom de domaine ! Je n'ai pas trouver comment faire sans... ##
|
||||
## ##
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
## ##
|
||||
## Pense-bête pour la configuration du serveur : ##
|
||||
## ##
|
||||
## - URL locale d'accès (pour l'installation): http://192.168.xxx.xxxx:8196 ##
|
||||
## - URL d'accès : https://gitea.ndd.tld ##
|
||||
## - Parmètres emailer : ##
|
||||
## - ENABLED = true ##
|
||||
## - HOST = smtp.gmail.com:465 ##
|
||||
## - FROM = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ##
|
||||
## - USER = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ##
|
||||
## - PASSWD = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ##
|
||||
## - MAILER_TYPE = smtp ##
|
||||
## - IS_TLS_ENABLED = true ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
---
|
||||
version: "2.4"
|
||||
|
||||
services:
|
||||
server:
|
||||
image: gitea/gitea:1 # On reste ici avec la dernière version stable de la branche 1.x.x
|
||||
# https://docs.gitea.io/en-us/install-with-docker/
|
||||
# https://docs.gitea.io/fr-fr/install-with-docker/
|
||||
# https://github.com/go-gitea/gitea
|
||||
container_name: gitea
|
||||
|
||||
#network_mode: "bridge"
|
||||
networks:
|
||||
- gitea_network
|
||||
|
||||
environment:
|
||||
- USER_UID=1000 # Utiliser la commande : id user
|
||||
- USER_GID=100 # Utiliser la commande : id user
|
||||
- APP_NAME=Mon Gitea perso
|
||||
- RUN_MODE=prod
|
||||
|
||||
# Les deux paramètres ci-dessous ne semblent pas fonctionner puisqu'il faut faire manuellement le réglage lors du setup...
|
||||
- REQUIRE_SIGNIN_VIEW=true # Enable this to force users to log in to view any page.
|
||||
- DISABLE_REGISTRATION=true # Disable registration, after which only admin can create accounts for users.
|
||||
|
||||
- DOMAIN=gitea.ndd.tld
|
||||
- SSH_DOMAIN=gitea.ndd.tld
|
||||
- ROOT_URL=https://gitea.ndd.tld
|
||||
- DB_TYPE=sqlite3
|
||||
- DB_HOST=localhost:3306
|
||||
- DB_NAME=gitea
|
||||
- DB_USER=root
|
||||
- DB_PASSWD="gitea_db_blabla"
|
||||
|
||||
- INSTALL_LOCK=false # Disallow access to the install page
|
||||
# À passer en true une fois installer la première fois.
|
||||
- GITEA__PICTURE__DISABLE_GRAVATAR=true
|
||||
- GITEA__PICTURE__ENABLE_FEDERATED_AVATAR=false
|
||||
|
||||
- GITEA__SERVICE__REGISTER_EMAIL_CONFIRM=true # Ne semble pas fonctionner puisqu'il faut cocher manuellement la case lors du setup...
|
||||
- GITEA__SERVICE__ENABLE_NOTIFY_MAIL=true # Ne semble pas fonctionner puisqu'il faut cocher manuellement la case lors du setup...
|
||||
|
||||
|
||||
# ###############
|
||||
# Le label ci-dessous permet à Watchtower de faire les mises à jour automatiquement
|
||||
# Cela peut-être supprimé si Watchtower n'est pas utilisé.
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
# ###############
|
||||
|
||||
volumes:
|
||||
- "/volume1/docker/gitea/data:/data" # Dossier pour les données de Gitea (Dépôts, BDD, config...)
|
||||
- "/volume1/docker/gitea/backup-data:/backup-data" # Dossier pour les sauvegardes régulières à lancer avec un script en tâche planifiée.
|
||||
- "/etc/localtime:/etc/localtime:ro" # Nécessaire pour avoir le temps local correct (vu que la variable TZ=Europe/Paris n'existe pas pour ce conteneur...)
|
||||
|
||||
ports:
|
||||
- "8196:3000" # Choisir un port de connexion libre sur votre machine, ce sera la port de connexion pour l'interface graphique
|
||||
# - "8197:22" # Idem ici, sauf que ce sera pour le port SSH, mais ça ne fonctionne pas avec une installation en Bridge...
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
gitea_network:
|
||||
external: false
|
||||
driver: bridge
|
||||
name: gitea_network
|
@ -1,272 +0,0 @@
|
||||
#!/bin/bash
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Script gitea-backup.sh ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## gitea-backup.sh [<méthode de backup>] ##
|
||||
## <méthode de backup> est facultatif. S'il n'est pas spécifié, on fait les deux ! ##
|
||||
## <méthode de backup> = gitea_dump ##
|
||||
## = archive_dossier ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## MAJ du 19.04.2021 : La partie de sauvegarde gite_dump a été commentée, et n'est donc ##
|
||||
## plus utilisée, car la restauration de cette archive est trop galère à mettre en place. ##
|
||||
## Donc soit on ne donne aucun paramètre en argument au script, soit on met archive_dossier. ##
|
||||
## L'autre paramètre n'aura donc plus aucun effet. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Objectif du script : faire une sauvegarde de l'installation Gitea @ Docker ##
|
||||
## Il y a aura un shutdown du conteneur le temps de la sauvegarde afin que la base de ##
|
||||
## données ne soit pas modifiée pendant le backup, puis le conteneur sera redémarré. ##
|
||||
## ##
|
||||
## Il faudra créer une tâche planifiée pour lancer la sauvegarde toutes les nuits, par ##
|
||||
## exemple à 3h du matin. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Une méthode officielle de backup de la base de données est présente ici : ##
|
||||
## https://docs.gitea.io/en-us/backup-and-restore/#backup-command-dump ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
|
||||
|
||||
# Récupération des arguments qu'on place dans des variables constantes
|
||||
declare -r nb_arg=$# # Nombre d'argument(s) fourni(s) au script.
|
||||
declare -r methode="$1" # 1er argument fourni
|
||||
|
||||
if [ "$methode" = "--help" ] || [ "$methode" = "-help" ] || [ "$methode" = "-h" ] || [ "$methode" = "--h" ]; then
|
||||
echo "Le script gitea-backup.sh permet de faire une sauvegarde des données du conteneur Gitea."
|
||||
echo "Utilisation : gitea-backup.sh [<méthode de backup>]"
|
||||
echo "L'argument <méthode de backup> est facultatif. S'il n'est pas spécifié, on fait les deux !"
|
||||
echo " <méthode de backup> = gitea_dump"
|
||||
echo " = archive_dossier"
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
|
||||
mode_backup=0 # 0 = aucune méthode indiquée ; 1 = gitea_dump ; 2 = archive_dossier
|
||||
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
## ##
|
||||
## VALEURS À PERSONNALISER ##
|
||||
## ##
|
||||
## Chemin d'accès vers votre dossier docker et vers le dossier de backup de gitea ##
|
||||
|
||||
# Chemin du dossier qui contient le dossier des données (data) et des backups (backup-data)
|
||||
GITEA_DOCKER_DIR=/volume1/docker/gitea
|
||||
|
||||
# Les noms des dossiers montés dans le conteneur doivent êtres identiques à ceux présents sur la machine hôte. Sinon faudra modifier le script...
|
||||
# Nom du dossier contenant les backups qui doit exister car il doit être monté dans le conteneur à l'aide du docker-compose.yml.
|
||||
GITEA_BACKUP_DIR=backup-data
|
||||
|
||||
# Nom du dossier contenant les donneés de Gitea (data)
|
||||
GITEA_DATA_DIR=data
|
||||
|
||||
# Nom du conteneur
|
||||
NOM_CONTENEUR=gitea
|
||||
|
||||
# ID de l'utilisateur du NAS qui a les droits sur le conteneur
|
||||
ID_USER_NAS=1060
|
||||
|
||||
# Nombre de jours d'archives-backup à garder (ça inclus le jour actuel)
|
||||
NB_JOURS_A_GARDER=10
|
||||
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
function pause() {
|
||||
read -p "$*"
|
||||
}
|
||||
|
||||
echo "$(date "+%R:%S - ") Script de sauvegarde des données du conteneur Gitea"
|
||||
|
||||
|
||||
##==============================================================================================
|
||||
## Vérification de la présence des dossiers du conteneur ##
|
||||
|
||||
cd $GITEA_DOCKER_DIR
|
||||
num_erreur=$? # On stocke le code de retour de la commande précédente.
|
||||
if [ $num_erreur -ne 0 ]; then # Si ce code n'est pas 0, il y a eu une erreur, on arrète le script.
|
||||
echo " Le chemin '$GITEA_DOCKER_DIR' est invalide ! Veuillez vérifier le chemin d'accès..."
|
||||
echo " Abandon, avec code d'erreur $num_erreur"
|
||||
exit $num_erreur
|
||||
fi
|
||||
|
||||
dossier_manquant=""
|
||||
if [ ! -d "$GITEA_BACKUP_DIR" ]; then
|
||||
dossier_manquant = "$GITEA_BACKUP_DIR"
|
||||
fi
|
||||
if [ ! -d "$GITEA_DATA_DIR" ]; then
|
||||
dossier_manquant = dossier_manquant + " ; $GITEA_DATA_DIR"
|
||||
fi
|
||||
if [ "$dossier_manquant" != "" ]; then
|
||||
echo " Le(s) dossier(s) suivant(s) n'existe(nt) pas : $dossier_manquant ."
|
||||
echo " Abandon, avec code d'erreur 999."
|
||||
exit 999
|
||||
else
|
||||
echo "-- Les dossiers $GITEA_BACKUP_DIR et $GITEA_DATA_DIR existent bien. Le script peut continuer."
|
||||
fi
|
||||
|
||||
# Autre méthode, effectuant davantage de tests... donc moins efficace...
|
||||
# if [ ! -d "$GITEA_BACKUP_DIR" ] || [ ! -d "$GITEA_DATA_DIR" ]; then # Au moins un des dossiers n'existe pas
|
||||
# if [ ! -d "$GITEA_BACKUP_DIR" ]; then # Le dossier $GITEA_BACKUP_DIR n'existe pas !
|
||||
# echo " Le dossier '$GITEA_BACKUP_DIR' n'existe pas !"
|
||||
# fi
|
||||
# if [ ! -d "$GITEA_DATA_DIR" ]; then # Le dossier $GITEA_DATA_DIR n'existe pas !
|
||||
# echo " Le dossier '$GITEA_DATA_DIR' n'existe pas !"
|
||||
# fi
|
||||
# echo " Abandon, avec code d'erreur 999"
|
||||
# exit 999
|
||||
# else
|
||||
# echo "-- Les dossiers $GITEA_BACKUP_DIR et $GITEA_DATA_DIR existent bien. On peut continuer."
|
||||
# fi
|
||||
##==============================================================================================
|
||||
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Définition du mode de backup à faire en fonction de la méthode donnée en argument ##
|
||||
case $methode in
|
||||
gitea_dump) # Méthode gitea_dump sélectionnée ##
|
||||
mode_backup=1
|
||||
#echo "mode_backup=$mode_backup"
|
||||
;;
|
||||
|
||||
archive_dossier) # Méthode archive_dossier sélectionnée ##
|
||||
mode_backup=2
|
||||
#echo "mode_backup=$mode_backup"
|
||||
;;
|
||||
|
||||
*) # Aucune méthode sélectionnée ##
|
||||
mode_backup=0
|
||||
#echo "mode_backup=$mode_backup"
|
||||
;;
|
||||
esac
|
||||
##==============================================================================================
|
||||
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Partie concernant les sauvegardes ##
|
||||
# if [ $mode_backup -eq 0 ] || [ $mode_backup -eq 1 ]; then
|
||||
# # Aucune méthode n'est choisie ou bien méthode gitea_dump sélectionnée
|
||||
|
||||
# # Rappel des variables :
|
||||
# # GITEA_DOCKER_DIR=/volume1/docker/gitea
|
||||
# # GITEA_BACKUP_DIR=backup-data
|
||||
# # GITEA_DATA_DIR=data
|
||||
# # NOM_CONTENEUR=gitea
|
||||
# # ID_USER_NAS=1060
|
||||
|
||||
# echo "-- Sauvegarde via Gitea dump. (un peu chiant à restaurer...)"
|
||||
# echo "###############################################################################"
|
||||
# # Dans la commande suivante, les chemins d'accès donnés en paramètres sont des chemins d'accès à l'intérieur du conteneur, montés avec le docker-compose.yml.
|
||||
# # Exemple de commande sans variables :
|
||||
# # docker exec -u 1060 -i -w /backup-data $(docker ps -qf "name=^gitea$") bash -c '/app/gitea/gitea dump -c /data/gitea/conf/app.ini'
|
||||
# # Note : La commande lancée dans une tâche CRON (planifiée) ne permet pas l'utilisation du paramètre -t.
|
||||
# # Commande à lancer dans un terminal :
|
||||
# # docker exec -u 1060 -i -w /backup-data $(docker ps -qf "name=^gitea$") bash -c '/app/gitea/gitea dump -c /data/gitea/conf/app.ini'
|
||||
# # Explication pour $(docker ps -qf "name=^gitea$") ici : https://stackoverflow.com/a/34497614
|
||||
|
||||
# docker exec -u $ID_USER_NAS -i -w /$GITEA_BACKUP_DIR $(docker ps -qf "name=^$NOM_CONTENEUR$") bash -c "/app/gitea/gitea dump -c /$GITEA_DATA_DIR/gitea/conf/app.ini"
|
||||
# num_erreur=$? # On stocke le code de retour de la commande précédente.
|
||||
# if [ $num_erreur -ne 0 ]; then # Si ce code n'est pas 0, il y a eu une erreur, on arrète le script.
|
||||
# echo "!!!!!! Erreur lors de la commande de backup gitea dump."
|
||||
# #echo "!!!!!! Commande lancée :"
|
||||
# #echo " docker exec -u $ID_USER_NAS -it -w /$GITEA_BACKUP_DIR $(docker ps -qf "name=$NOM_CONTENEUR") bash -c "/app/gitea/gitea dump -c /$GITEA_DATA_DIR/gitea/conf/app.ini""
|
||||
# echo "!!!!!! Abandon, avec code d'erreur $num_erreur"
|
||||
# exit $num_erreur
|
||||
# fi
|
||||
# echo "###############################################################################"
|
||||
# echo "-- Sauvegarde via Gitea dump terminée."
|
||||
# fi
|
||||
|
||||
|
||||
if [ $mode_backup -eq 0 ] || [ $mode_backup -eq 2 ]; then
|
||||
# Aucune méthode n'est choisie ou bien méthode archive_dossier sélectionnée
|
||||
echo "-- Sauvegarde par création d'une archive de tout le dossier $GITEA_DATA_DIR"
|
||||
echo "###############################################################################"
|
||||
cd $GITEA_DOCKER_DIR # Même si on est censé déjà être là...
|
||||
|
||||
#retour_cmd=1111 # Valeur reset
|
||||
echo "-- Extinction du conteneur $(docker stop $NOM_CONTENEUR) : OK."
|
||||
# retour_cmd=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
# if [ $retour_cmd -ne 0 ]; then
|
||||
# if [ $retour_cmd -eq 1111 ]; then
|
||||
# echo "### DEBUG : soucis avec la récupération du retour de commande #1470000 "
|
||||
# exit 1470000
|
||||
# fi
|
||||
# echo "!! Le conteneur $NOM_CONTENEUR ne peut pas être arrêté..."
|
||||
# echo "!! Fin du script. Erreur 777"
|
||||
# echo
|
||||
# exit 777
|
||||
# fi
|
||||
echo "-- Création de l'archive du dossier $GITEA_DATA_DIR"
|
||||
|
||||
# Compression tar.gz :
|
||||
#tar -czf $GITEA_BACKUP_DIR/Gitea-Data-Backup-`date +%Y-%m-%d--%Hh%Mm%Ss`.tar.gz ./$GITEA_DATA_DIR
|
||||
|
||||
# Compression 7z après obtention d'un .tar
|
||||
# On Linux/Unix, in order to backup directories you must use tar :
|
||||
# - to backup a directory : tar cf - directory | 7z a -si directory.tar.7z
|
||||
# - to restore your backup : 7z x -so directory.tar.7z | tar xf -
|
||||
tar cf - ./$GITEA_DATA_DIR | 7z a -si $GITEA_BACKUP_DIR/Gitea-Data-Backup-`date +%Y-%m-%d--%Hh%Mm%Ss`.7z
|
||||
|
||||
echo "-- Archive de tout le dossier $GITEA_DATA_DIR créée."
|
||||
|
||||
# retour_cmd=1111 # Valeur reset
|
||||
echo "-- Redémarrage du conteneur $(docker start $NOM_CONTENEUR) : OK."
|
||||
# retour_cmd=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
# if [ $retour_cmd -ne 0 ]; then
|
||||
# if [ $retour_cmd -eq 1111 ]; then
|
||||
# echo "### DEBUG : soucis avec la récupération du retour de commande #1470000 "
|
||||
# exit 1470000
|
||||
# fi
|
||||
# echo "!! Le conteneur $NOM_CONTENEUR ne peut pas être redémarré..."
|
||||
# echo "!! Fin du script. Erreur 777"
|
||||
# echo
|
||||
# exit 777
|
||||
# fi
|
||||
|
||||
# Section concernant la rotation des sauvegardes.
|
||||
echo
|
||||
echo "-- Rotation des sauvegardes anciennes selon le nombre de jours d'archives à garder (=$NB_JOURS_A_GARDER) incluant ce jour :"
|
||||
echo
|
||||
echo
|
||||
echo "-- -- Utilisation de la fonction find pour trouver les fichiers de plus de $nb_jours_a_garder jours (incluant ce jour)."
|
||||
echo "-- -- Les fichiers suivants seront supprimés :"
|
||||
find $GITEA_BACKUP_DIR/* -name 'Gitea-Data-Backup*' -mtime +"$((NB_JOURS_A_GARDER - 1))" -exec ls -lat --color {} \;
|
||||
|
||||
# Utile pour débugguer avant de supprimer réellement les fichiers.
|
||||
#pause '--DEBUG-- Appuyer sur la touche [Entrer] pour continuer...'
|
||||
|
||||
echo "-- -- Suppression de ces fichiers..."
|
||||
find $GITEA_BACKUP_DIR/* -name 'Gitea-Data-Backup*' -mtime +"$((NB_JOURS_A_GARDER - 1))" -exec rm -v {} \;
|
||||
|
||||
############################################################
|
||||
# Cette partie peut être commentée
|
||||
echo
|
||||
echo "-- -- Il reste donc les fichiers suivants :"
|
||||
ls -lat --color $GITEA_BACKUP_DIR/Gitea-Data-Backup*
|
||||
############################################################
|
||||
|
||||
|
||||
echo "###############################################################################"
|
||||
echo "-- Processus de sauvegarde par création d'archive terminé."
|
||||
|
||||
fi
|
||||
|
||||
echo "$(date "+%R:%S - ") Fin du script de sauvegarde des donneés du conteneur Gitea"
|
||||
exit 0
|
||||
## ##
|
||||
##==============================================================================================
|
@ -1,368 +0,0 @@
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Script gitea-restore.sh ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## gitea-restore.sh <méthode de backup> <fichier à restaurer> ##
|
||||
## <méthode de backup> = --gitea_dump ou --gdmp ##
|
||||
## = --archive_dossier ou --ad ##
|
||||
## <fichier à restaurer> = le nom du fichier archive à utiliser pour la restauration. ##
|
||||
## Ne peut être qu'un .zip pour la méthode --gitea_dump, ##
|
||||
## ou bien ##
|
||||
## ne peut être qu'un .tar.gz pour la méthode --archive_dossier #
|
||||
## Il faut impérativement donner le chemin d'accès complet de ce fichier archive... ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Objectif du script : Restaurer la sauvegarde de Gitea passée en paramètre ##
|
||||
## Il faudra indiquer la méthode de restauration basée sur le type de sauvegarde à restaurer. ##
|
||||
## Il faudra également indiquer l'archive à utiliser pour la restauration. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Une méthode officielle de restauration, de la base de données est présente ici : ##
|
||||
## https://docs.gitea.io/en-us/backup-and-restore/#restore-command-restore ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## MAJ du 19.04.2021 : La partie de sauvegarde gite_dump ne sera pas programmée car c'est ##
|
||||
## trop galère à mettre en place. ##
|
||||
## Donc soit on ne donne aucun paramètre en argument au script, soit on met archive_dossier. ##
|
||||
## L'autre paramètre n'aura donc plus aucun effet. Ne pas l'utiliser ! ##
|
||||
## Cependant le code pour distinguer les deux paramètres reste, mais il n'y aura rien dans ##
|
||||
## la partie gitea_dump. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
|
||||
# Récupération des arguments qu'on place dans des variables constantes
|
||||
declare -r nb_arg=$# # Nombre d'argument(s) fourni(s) au script.
|
||||
declare -r methode="$1" # 1er argument fourni
|
||||
declare -r fichier="$2" # 2ème argument fourni
|
||||
declare -r tous_les_args="$*" # Tous les arguments
|
||||
|
||||
##==============================================================================================
|
||||
## VALEURS À PERSONNALISER ##
|
||||
## ##
|
||||
## Chemin d'accès vers votre dossier docker et vers le dossier de backup de gitea ##
|
||||
##==============================================================================================
|
||||
# Chemin complet du dossier qui contient le dossier des données (data) et des backups (backup-data)
|
||||
GITEA_DOCKER_DIR=/volume1/docker/gitea
|
||||
|
||||
# Les noms des dossiers montés dans le conteneur doivent êtres identiques à ceux présents sur la machine hôte. Sinon faudra modifier le script...
|
||||
# Nom du dossier contenant les backups qui doit exister car il doit être monté dans le conteneur à l'aide du docker-compose.yml.
|
||||
GITEA_BACKUP_DIR=backup-data
|
||||
|
||||
# Nom du dossier contenant les donneés de Gitea (data)
|
||||
GITEA_DATA_DIR=data
|
||||
|
||||
# Nom du conteneur
|
||||
NOM_CONTENEUR=gitea
|
||||
|
||||
# ID de l'utilisateur du NAS qui a les droits sur le conteneur
|
||||
ID_USER_NAS=1000
|
||||
##==============================================================================================
|
||||
##==============================================================================================
|
||||
|
||||
echo
|
||||
echo "Le script gitea-restore.sh permet de faire une restauration des données du conteneur Gitea."
|
||||
echo
|
||||
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
## Début de la section concernant les fonctions ##
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
f_affiche_syntaxe(){
|
||||
# Fonction pour afficher la syntaxe d'utilisation du fichier script.
|
||||
# syntax: f_affiche_syntaxe <paramètre1> [<paramètre2>]
|
||||
# 1er paramètre : $1
|
||||
# 2nd paramètre éventuel : $2 Ce sera ce qui a été fourni en argument du script.
|
||||
local f_nb_arg=$#
|
||||
local f_param_1=$1
|
||||
local f_param_2=$2
|
||||
echo
|
||||
if [ "$f_param_1" = "#1" ]; then
|
||||
echo "La méthode de restauration choisie '$f_param_2' est incorrecte."
|
||||
echo
|
||||
elif [ "$f_param_1" = "#2" ]; then
|
||||
if [ -z "$f_param_2" ]; then
|
||||
echo "Aucun paramètre n'a été fourni au script..."
|
||||
else
|
||||
echo "Le nombre de paramètre fourni n'est pas correct. Paramètres fournis : '$f_param_2'"
|
||||
fi
|
||||
echo
|
||||
fi
|
||||
echo "Utilisation : gitea-restore.sh <méthode de backup> <fichier à restaurer>"
|
||||
#echo " * <méthode de backup> : --gitea_dump ou --gdmp pour utiliser la méthode gitea dump."
|
||||
|
||||
echo " * <méthode de backup> : --archive_dossier ou --ad pour utiliser la méthode archive dossier."
|
||||
echo " * <fichier à restaurer> : le nom du fichier archive à utiliser pour la restauration."
|
||||
#echo " Ne peut être qu'un .zip pour la méthode --gitea_dump,"
|
||||
#echo " ou bien ne peut être qu'un .7z ou .tar.gz pour la méthode --archive_dossier"
|
||||
echo " Ne peut être qu'un .7z ou un .tar.gz pour la méthode --archive_dossier."
|
||||
echo " Il faut impérativement donner le chemin d'accès complet de ce fichier archive..."
|
||||
echo
|
||||
|
||||
if [ "$f_param_1" = "#3" ]; then
|
||||
exit 1
|
||||
fi
|
||||
exit 3
|
||||
}
|
||||
|
||||
f_verif_fichier_existe() {
|
||||
# Fonction qui vérifie si le fichier fourni en paramètre existe, et qu'il s'agit d'un
|
||||
# fichier zip ou d'un fichier 7z.
|
||||
# Quoiqu'il arrive, l'appel à cette fonction marque la fin du script.
|
||||
#
|
||||
# syntax: f_verif_fichier_existe [<fichier_a_tester>]
|
||||
|
||||
local fichier_a_tester=$1
|
||||
|
||||
if [ -z "$fichier_a_tester" ]; then
|
||||
echo "!! Erreur fatale, le paramètre à tester de la fonction f_verif_fichier_existe() est vide ! Revoir l'appel à la fonction..."
|
||||
echo "!! Fin du script. Code d'erreur 10."
|
||||
return 11 # On stoppe immédiatement l'exécution de la fonction !
|
||||
fi
|
||||
if [ ! -s "$fichier_a_tester" ]; then # Le fichier 'fichier_a_tester' n'existe pas ou a un taille de 0 !
|
||||
return 1 # C'est le code d'erreur pour indiquer que le fichier n'existe pas.
|
||||
fi
|
||||
|
||||
# Quelle est l'extension du fichier fichier_a_tester ?
|
||||
fullfilename="$fichier_a_tester"
|
||||
filename=$(basename "$fullfilename")
|
||||
ext="${filename#*.}"
|
||||
echo $ext
|
||||
return 0
|
||||
}
|
||||
|
||||
f_verif_dossier_existe() {
|
||||
# Fonction qui vérifie si le dossier fourni en paramètre existe.
|
||||
#
|
||||
# syntax: f_verif_dossier_existe <dossier_a_tester>
|
||||
|
||||
local dossier_a_tester=$1 # On récupère le 1er paramètre passé en argument à la fonction.
|
||||
|
||||
if [ -d "$dossier_a_tester" ]; then # Le dossier 'dossier_a_tester' existe ! Il sera renommé.
|
||||
return 0 # C'est le code d'erreur pour indiquer que le dossier existe bien.
|
||||
else
|
||||
return 1 # C'est le code d'erreur pour indiquer que le dossier n'existe pas.
|
||||
fi
|
||||
|
||||
# Si le script arrive ici, c'est qu'il y a un soucis...
|
||||
echo "BLABLA Si tu lis ça, c'est que y a une couille dans le paté !!! 9988"
|
||||
exit 9988
|
||||
}
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
## Fin de la section concernant les fonctions ##
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
## Début du programme principal ##
|
||||
##──── ────────────────────────────────────────────────────────────────────────────────────────
|
||||
if [ $nb_arg -ne 2 ]; then
|
||||
f_affiche_syntaxe "#2" "$tous_les_args" # On affiche la syntaxe car le nombre de paramètres n'est pas correct.
|
||||
fi
|
||||
|
||||
mode_backup=""
|
||||
case "$methode" in
|
||||
--[hH][eE][lL][pP] | --[hH] | -[hH][eE][lL][pP] | -[hH] ) # Premier argument --help ou --h
|
||||
f_affiche_syntaxe # On affiche la syntaxe
|
||||
;;
|
||||
|
||||
--gitea_dump | --gdmp)
|
||||
mode_backup="gitea_dump"
|
||||
;; # On ne surcharge pas cette partie avec le code de restauration, ce sera fait plus bas.
|
||||
|
||||
--archive_dossier | --ad)
|
||||
mode_backup="archive_dossier"
|
||||
;; # On ne surcharge pas cette partie avec le code de restauration, ce sera fait plus bas.
|
||||
|
||||
*) # Aucune méthode sélectionnée valide ou bien trop d'arguments
|
||||
mode_backup="non_choisi"
|
||||
f_affiche_syntaxe "#1" "$methode" # On affiche la syntaxe car le paramètre de méthode est incorrect.
|
||||
echo "BLABLA Si tu lis ça, c'est que y a une couille dans le paté !!! 9999"
|
||||
exit 9999
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "La méthode de restauration choisie est : $methode "
|
||||
echo
|
||||
|
||||
# Test si le fichier en argument existe et est valide (archive zip pour ).
|
||||
ext_fichier=""
|
||||
ext_fichier="$(f_verif_fichier_existe $fichier)" # Vérification que le fichier à restaurer existe bien et est bien un .zip ou un .7z
|
||||
retour_fct=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
if [ $retour_fct -ne 0 ]; then
|
||||
case "$retour_fct" in
|
||||
1) # Le fichier n'existe pas.
|
||||
echo "!! Le fichier $fichier n'existe pas. La restauration ne peut pas s'effectuer."
|
||||
echo "!! Fin du script. Erreur 10"
|
||||
echo
|
||||
exit 10
|
||||
;;
|
||||
11) # Problème avec l'appelle de la fonction, revoir le code ci-dessus...
|
||||
exit 11
|
||||
;;
|
||||
*) # Toutes autres valeurs ne devrait pas exister !
|
||||
echo "!! Erreur fatale qui ne devrait pas exister !"
|
||||
echo "!! Code d'erreur 1000"
|
||||
exit 1000
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "Le fichier existe et a une taille non nulle. Le script peut continuer."
|
||||
echo
|
||||
echo "Début de la restauration ---"
|
||||
fi
|
||||
|
||||
cd $GITEA_DOCKER_DIR # On se place dans le dossier du conteneur gitea
|
||||
retour_cmd=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
if [ $retour_cmd -ne 0 ]; then
|
||||
echo "!! Le dossier $GITEA_DOCKER_DIR semble ne pas exister. Vérifier la variable GITEA_DOCKER_DIR dans le script."
|
||||
echo "!! Fin du script. Erreur 333"
|
||||
echo
|
||||
exit 333
|
||||
fi
|
||||
|
||||
# Note : Si le dossier GITEA_DATA_DIR existe il sera renommé en GITEA_DATA_DIR--$(date +%Y-%m-%d--%Hh%M)
|
||||
# avec la commande mv "$GITEA_DATA_DIR" "$GITEA_DATA_DIR--$(date +%Y-%m-%d--%Hh%M)"
|
||||
# Ce test sera fait lors de l'appel de la fonction verif_dossier_existe().
|
||||
# Aucun choix ne sera possible, le dossier existant sera forcément renommé.
|
||||
#
|
||||
# Note : Il faut que le dossier GITEA_BACKUP_DIR existe, ce qui semble acquis vu que le fichier backup
|
||||
# à restaurer doit être dedans... Mais il est vital que ce dossier existe car un dossier 'TEMP'
|
||||
# y sera créé pour extraire les données de l'archive (zip, 7z, ou tar.gz)...
|
||||
#
|
||||
# On teste maintenant l'existence des deux dossiers précédents.
|
||||
# Si un des deux dossiers n'est pas présents, le script sera interrompu.
|
||||
|
||||
# 1er test : GITEA_DATA_DIR
|
||||
retour_fct=11111 # Valeur reset.
|
||||
f_verif_dossier_existe $GITEA_DATA_DIR
|
||||
retour_fct=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
if [ $retour_fct -eq 0 ]; then # Le dossier existe, on peut continuer
|
||||
echo "-- Le dossier $dossier_a_tester existe et va être renommé en $dossier_a_tester--$(date +%Y-%m-%d--%Hh%M)"
|
||||
else # Le dossier n'existe pas
|
||||
echo "!! Le dossier $dossier_a_tester n'existe ! Veuillez créer le dossier $dossier_a_tester puis relancer le script."
|
||||
echo "!! Interruption de l'exécution du script. Code 444"
|
||||
exit 444 # C'est le code d'erreur pour indiquer que le dossier n'existe pas et que le script a été interrompu.
|
||||
fi
|
||||
|
||||
# 2ème test : GITEA_BACKUP_DIR
|
||||
retour_fct=11111 # Valeur reset.
|
||||
f_verif_dossier_existe $GITEA_BACKUP_DIR
|
||||
retour_fct=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
if [ $retour_fct -eq 0 ]; then # Le dossier existe, on peut continuer
|
||||
echo "-- Le dossier $dossier_a_tester existe bien. La restauration peut continuer."
|
||||
else # Le dossier n'existe pas
|
||||
echo "!! Le dossier $dossier_a_tester n'existe ! Vérifier que ce dossier est bien paramétré dans le script."
|
||||
echo "!! Interruption de l'exécution du script. Code 555"
|
||||
exit 555 # C'est le code d'erreur pour indiquer que le dossier n'existe pas et que le script a été interrompu.
|
||||
fi
|
||||
|
||||
# Maintenant on sait que les deux dossiers GITEA_BACKUP_DIR et GITEA_DATA_DIR existent.
|
||||
|
||||
case "$mode_backup" in
|
||||
gitea_dump)
|
||||
|
||||
if [ $ext_fichier != "zip" ]; then
|
||||
echo "!! Le fichier archive $(basename "$fichier") n'est pas une archive ZIP."
|
||||
echo "!! Fin du script."
|
||||
f_affiche_syntaxe "#3"
|
||||
fi
|
||||
|
||||
echo -e "\t-- Méthode de restauration à venir, un jour si j'ai le courage...\n"
|
||||
echo -e "\t-- Donc, pour le moment il ne se passera rien avec cette méthode...\n"
|
||||
exit 0
|
||||
|
||||
# Extraction de l'archive zip créé avec gitea dump avec 7z :
|
||||
# 7z x -o/volume1/docker/gitea/backup-data -tzip /volume1/docker/gitea/backup-data/gitea-dump-1618217429.zip
|
||||
|
||||
echo
|
||||
;;
|
||||
|
||||
archive_dossier)
|
||||
|
||||
if [ $ext_fichier != "7z" ] && [ $ext_fichier != "tar.gz" ]; then
|
||||
echo "!! Le fichier archive $(basename "$fichier") n'est pas une archive 7z ou tar.gz."
|
||||
echo "!! Fin du script."
|
||||
f_affiche_syntaxe "#3" # Le script est interrompu.
|
||||
fi
|
||||
|
||||
echo -e "\t-- Restauration de la sauvegarde $fichier \n\t par extraction de l'archive dans le dossier $GITEA_DATA_DIR\n"
|
||||
|
||||
# Comme on sait que le dossier existe, il est renommée après avoir éteint le conteneur.
|
||||
retour_cmd=1111 # Valeur reset
|
||||
echo -e "\t-- Extinction du conteneur $(docker stop $NOM_CONTENEUR)\n"
|
||||
retour_cmd=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
if [ $retour_cmd -ne 0 ]; then
|
||||
if [ $retour_cmd -eq 1111 ]; then
|
||||
echo "### DEBUG : soucis avec la récupération du retour de commande #1470000 "
|
||||
exit 1470000
|
||||
fi
|
||||
echo "!! Le conteneur $NOM_CONTENEUR ne peut pas être arrêté..."
|
||||
echo "!! Fin du script. Erreur 777"
|
||||
echo
|
||||
exit 777
|
||||
fi
|
||||
|
||||
mv "$GITEA_DATA_DIR" "$GITEA_DATA_DIR--$(date +%Y-%m-%d--%Hh%M)"
|
||||
|
||||
# En fonction du type d'archive donnée en paramètre au script, ce n'est pas la même manière d'extraire les données.
|
||||
# Mais quoiqu'il arrive on crée un dossier TEMP dans le dossier GITEA_BACKUP_DIR pour y placer les données extraites.
|
||||
# Ce dossier TEMP sera supprimé à la fin de la restauration.
|
||||
mkdir "$GITEA_BACKUP_DIR/TEMP"
|
||||
|
||||
case "$ext_fichier" in
|
||||
7z)
|
||||
echo -e "\t-- Extraction des données de l'archive 7z utilisée.\n"
|
||||
# Restauration d'un fichier 7z :
|
||||
7z x -so $fichier | tar xf - -C "$GITEA_BACKUP_DIR/TEMP"
|
||||
;;
|
||||
tar.gz)
|
||||
echo -e "\t-- Extraction des données de l'archive tar.gz utilisée.\n"
|
||||
# Restauration d'un fichier tar.gz :
|
||||
tar -xzf $fichier -C "$GITEA_BACKUP_DIR/TEMP"
|
||||
;;
|
||||
*)
|
||||
echo "Erreur d'extension non prévue ! Revoir le code. Erreur 88."
|
||||
exit 88
|
||||
esac
|
||||
|
||||
# On déplace le dossier extrait data dans GITEA_DOCKER_DIR (Rappel on est dans le dossier gitea qui contient le dossiers GITEA_BACKUP_DIR)
|
||||
mv "$GITEA_BACKUP_DIR/TEMP/data" "$GITEA_DOCKER_DIR" # On pourrait utiliser "./" à la place de "$GITEA_DOCKER_DIR"
|
||||
|
||||
# Le dossier TEMP étant maintenant vide, on le supprime
|
||||
rm -rf "$GITEA_BACKUP_DIR/TEMP"
|
||||
|
||||
retour_cmd=1111 # Valeur reset
|
||||
echo -e "\t-- Redémarrage du conteneur $(docker start $NOM_CONTENEUR)\n"
|
||||
retour_cmd=$? # Le code d'exit de la fonction est stocké dans cette variable.
|
||||
if [ $retour_cmd -ne 0 ]; then
|
||||
if [ $retour_cmd -eq 1111 ]; then
|
||||
echo "### DEBUG : soucis avec la récupération du retour de commande #1470000 "
|
||||
exit 1470000
|
||||
fi
|
||||
echo "!! Le conteneur $NOM_CONTENEUR ne peut pas être redémarré..."
|
||||
echo "!! Fin du script. Erreur 777"
|
||||
echo
|
||||
exit 777
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "!! Un problème est survenu ! Revoir le script. Code XYZ = 199 !"
|
||||
echo
|
||||
return 199
|
||||
;;
|
||||
esac
|
||||
|
||||
echo
|
||||
echo "Restauration terminée. Bonne journée :)"
|
||||
echo
|
Binary file not shown.
Before Width: | Height: | Size: 64 KiB |
Binary file not shown.
Before Width: | Height: | Size: 26 KiB |
Binary file not shown.
Before Width: | Height: | Size: 174 KiB |
@ -1,22 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: '3.3'
|
||||
services:
|
||||
heimdall:
|
||||
container_name: heimdall
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
ports:
|
||||
- '80:80' # WebUI les mots passes etant sensibles il vaut mieux se connecter sur le port 443
|
||||
- '443:443' # WebUI SSL
|
||||
volumes:
|
||||
- '/volume1/docker/heimdall/config:/config'
|
||||
restart: unless-stopped
|
||||
image: ghcr.io/linuxserver/heimdall
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: 'heimdall_network'
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
@ -1,53 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: "2"
|
||||
|
||||
services:
|
||||
huginn:
|
||||
image: huginn/huginn
|
||||
container_name: huginn
|
||||
networks:
|
||||
- huginn_network
|
||||
ports:
|
||||
- 3000:3000
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- DATABASE_NAME=huginn
|
||||
- DATABASE_USERNAME=huginn
|
||||
- DATABASE_PASSWORD=1234 #Correspond au MYSQL_PASSWORD defini dans le conteneur mariadb
|
||||
- DATABASE_PORT=3306
|
||||
- DATABASE_HOST=huginn_mariadb
|
||||
- DATABASE_ADAPTER=mysql2
|
||||
- DO_NOT_CREATE_DATABASE=true
|
||||
depends_on:
|
||||
- huginn_mariadb
|
||||
restart: unless-stopped
|
||||
huginn_mariadb:
|
||||
image: ghcr.io/linuxserver/mariadb
|
||||
container_name: huginn_mariadb
|
||||
hostname: huginn_mariadb
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
networks:
|
||||
- huginn_network
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=100 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- MYSQL_ROOT_PASSWORD=123456
|
||||
- TZ=Europe/Paris
|
||||
- MYSQL_DATABASE=huginn
|
||||
- MYSQL_USER=huginn
|
||||
- MYSQL_PASSWORD=1234
|
||||
ports:
|
||||
- 3306:3306 # Utiliser un autre port si le port par defaut est deja pris sur votre hote
|
||||
volumes:
|
||||
- /volume1/docker/huginn/mariadb:/config
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
huginn_network:
|
||||
external:
|
||||
name: huginn_network
|
@ -1,39 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-13
|
||||
version: "2.1"
|
||||
services:
|
||||
jackett:
|
||||
image: ghcr.io/linuxserver/jackett
|
||||
container_name: jackett
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
- AUTO_UPDATE=true
|
||||
volumes:
|
||||
- /volume1/docker/jackett/config:/config
|
||||
ports:
|
||||
- 9117:9117 # WebUI
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: jackett_network
|
||||
|
||||
flaresolverr:
|
||||
image: ghcr.io/flaresolverr/flaresolverr:latest
|
||||
container_name: flaresolverr
|
||||
environment:
|
||||
- LOG_LEVEL=info
|
||||
- LOG_HTML=false
|
||||
- CAPTCHA_SOLVER=harvester # Plusieurs solvers possible voir le github
|
||||
- HARVESTER_ENDPOINT=https://127.0.0.1:5000/token
|
||||
ports:
|
||||
- 8191:8191
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: jackett_network
|
@ -1,56 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: '2.1'
|
||||
|
||||
services:
|
||||
jellyfin:
|
||||
image: ghcr.io/linuxserver/jellyfin
|
||||
container_name: jellyfin
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=100 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
# Utiliser la commande suivant pour limiter l'usage de la RAM
|
||||
# mem_limit: 4096M
|
||||
# Decommenter les 2 lignes suivantes pour activer le transcodage matériel iGPU( si NAS/serveur compatible )
|
||||
# devices:
|
||||
# - /dev/dri:/dev/dri
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
networks:
|
||||
- 'jellyfin_network' #si modification changer la ligne 45
|
||||
ports:
|
||||
- 8096:8096 # WebUI
|
||||
volumes:
|
||||
- /volume1/docker/jellyfin/config:/config
|
||||
- /volume1/media/music:/data/music
|
||||
- /volume1/media/movies:/data/movies
|
||||
- /volume1/media/tvshow:/data/tvshow
|
||||
restart: unless-stopped
|
||||
|
||||
embystat:
|
||||
image: ghcr.io/linuxserver/embystat
|
||||
container_name: embystat
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=100 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
networks:
|
||||
- 'jellyfin_network' #si modification de la ligne 23
|
||||
volumes:
|
||||
- /volume1/docker/embystat/config:/config
|
||||
ports:
|
||||
- 6555:6555 # WebUI
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
jellyfin_network:
|
||||
external:
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
name: 'jellyfin_network' #si modification de la ligne 23 et 45
|
@ -1,23 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-13
|
||||
version: "2.1"
|
||||
services:
|
||||
lidarr:
|
||||
image: ghcr.io/linuxserver/lidarr
|
||||
container_name: lidarr
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
volumes:
|
||||
- /volume1/docker/lidarr/config:/config
|
||||
- /volume1/docker/music:/music
|
||||
- /volume1/docker/downloads:/downloads
|
||||
ports:
|
||||
- 8686:8686 # WeUI
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: lidarr_network
|
@ -1,29 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: "2.1"
|
||||
|
||||
services:
|
||||
nextcloud:
|
||||
image: ghcr.io/linuxserver/nextcloud
|
||||
container_name: nextcloud
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
networks:
|
||||
- nextcloud_network
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=100 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- /volume1/docker/nextcloud/config:/config
|
||||
- /volume1/docker/data:/data
|
||||
ports:
|
||||
- 443:443 # WebUI Utiliser un autre port si le port par defaut est deja pris sur votre hote
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
nextcloud_network:
|
||||
external:
|
||||
name: nextcloud_network
|
@ -1,26 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-05
|
||||
version: '3'
|
||||
services:
|
||||
app:
|
||||
image: 'jc21/nginx-proxy-manager:latest'
|
||||
ports:
|
||||
- '80:80' # Ne pas oublier le NAT de votre routeur
|
||||
- '81:81' # WebUI Login 'admin@example.com' Password 'changeme'
|
||||
- '443:443' # Ne pas oublier le NAT de votre routeur
|
||||
volumes:
|
||||
- /volume1/docker/nginx-proxy-manager/config.json:/app/config/production.json
|
||||
- /volume1/docker/nginx-proxy-manager/data:/data
|
||||
- /volume1/docker/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: 'yobasystems/alpine-mariadb'
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: 'npm'
|
||||
MYSQL_DATABASE: 'npm'
|
||||
MYSQL_USER: 'npm'
|
||||
MYSQL_PASSWORD: 'npm'
|
||||
volumes:
|
||||
- /volume1/docker/nginx-proxy-manager/data/mysql:/var/lib/mysql
|
||||
restart: unless-stopped
|
@ -1,21 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: '3.3'
|
||||
services:
|
||||
linuxserver:
|
||||
container_name: ombi-dev
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
ports:
|
||||
- '3579:3579' # WebUI
|
||||
volumes:
|
||||
- '/volume1/docker/ombi/config:/config'
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: 'ghcr.io/linuxserver/ombi:development'
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: 'ombi_network'
|
@ -1,5 +0,0 @@
|
||||
RT_DHT_PORT=6881
|
||||
XMLRPC_PORT=8000
|
||||
RUTORRENT_PORT=8080
|
||||
WEBDAV_PORT=9000
|
||||
RT_INC_PORT=50000
|
@ -1,148 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-06-06
|
||||
##
|
||||
## NOTE : ATTENTION NE PAS BASCULER SUR L'IMAGE CRAZYMAX AVEC LES FICHIERS DE
|
||||
## VOTRE ANCIENNE CONFIG LINUXSERVER/RUTORRENT
|
||||
## Voir : https://blog.thelazyfox.xyz/docker-linuxserver-rutorrent-deprecated-what-i-have-done/
|
||||
##
|
||||
|
||||
version: '3.2'
|
||||
|
||||
services:
|
||||
vpn:
|
||||
image: dperson/openvpn-client:latest
|
||||
container_name: vpn
|
||||
restart: unless-stopped
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
sysctls:
|
||||
- net.ipv6.conf.all.disable_ipv6=0
|
||||
security_opt:
|
||||
- label:disable
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=100
|
||||
- TZ=Europe/Paris
|
||||
networks:
|
||||
- vpn-network
|
||||
dns:
|
||||
- 84.200.69.80
|
||||
- 8.8.8.8
|
||||
- 9.9.9.9
|
||||
ports :
|
||||
- 8080:8080 # WebUI rutorrent
|
||||
- 9117:9117 # WebUI jackett
|
||||
- 7878:7878 # WebUI radarr
|
||||
- 8989:8989 # WebUI sonarr
|
||||
- 8191:8191 #flaresolver
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
volumes:
|
||||
- /volume1/docker/vpn/config:/vpn
|
||||
- /volume1/docker/vpn/scripts:/scripts
|
||||
command: '-f "" -r 192.168.0.0/24'
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-Ss", "ifconfig.co"]
|
||||
interval: 60s
|
||||
timeout: 15s
|
||||
|
||||
sonarr:
|
||||
image: ghcr.io/linuxserver/sonarr
|
||||
container_name: sonarr
|
||||
network_mode: "service:vpn"
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=100
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- /volume1/docker/sonarr/config:/config
|
||||
- /volume1/docker/rutorrent-vpn/downloads:/downloads
|
||||
- /volume1/Mes Séries:/tv
|
||||
restart: unless-stopped
|
||||
|
||||
radarr:
|
||||
image: ghcr.io/linuxserver/radarr:nightly
|
||||
container_name: radarr
|
||||
network_mode: "service:vpn"
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=100
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- /volume1/docker/radarr/config:/config
|
||||
- /volume1/docker/rutorrent-vpn/downloads:/downloads
|
||||
- /volume1/Mes Films:/movies
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
jackett:
|
||||
image: ghcr.io/linuxserver/jackett
|
||||
container_name: jackett
|
||||
network_mode: "service:vpn"
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=100
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- /volume10/docker/jackett/config:/config
|
||||
- /volume10/docker/jackett/downloads:/downloads
|
||||
restart: unless-stopped
|
||||
|
||||
flaresolverr:
|
||||
image: ghcr.io/flaresolverr/flaresolverr
|
||||
container_name: flaresolverr
|
||||
network_mode: "service:vpn"
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- LOG_LEVEL=info
|
||||
restart: unless-stopped
|
||||
|
||||
rtorrent-rutorrent:
|
||||
image: crazymax/rtorrent-rutorrent:latest
|
||||
container_name: rutorrent-crazymax
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
depends_on:
|
||||
- vpn
|
||||
env_file:
|
||||
- "./rtorrent-rutorrent.env"
|
||||
- ".env"
|
||||
network_mode: "service:vpn"
|
||||
volumes:
|
||||
- "/volume1/docker/rutorrent/data:/data"
|
||||
- "/volume1/docker/rutorrent/passwd:/passwd"
|
||||
- "/volume1/docker/rutorrent/downloads:/downloads"
|
||||
ulimits:
|
||||
nproc: 65535
|
||||
nofile:
|
||||
soft: 32000
|
||||
hard: 40000
|
||||
restart: unless-stopped
|
||||
|
||||
geoip-updater:
|
||||
image: crazymax/geoip-updater:latest
|
||||
container_name: geoip-rutorrent-crazymax
|
||||
network_mode: "service:vpn"
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
depends_on:
|
||||
- rtorrent-rutorrent
|
||||
volumes:
|
||||
- "/volume1/docker/rutorrent/data/geoip:/data"
|
||||
env_file:
|
||||
- "./geoip-updater.env"
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
vpn-network:
|
||||
external:
|
||||
name: vpn-network
|
@ -1,7 +0,0 @@
|
||||
TZ=Europe/Paris
|
||||
EDITION_IDS=GeoLite2-City,GeoLite2-Country
|
||||
LICENSE_KEY=
|
||||
DOWNLOAD_PATH=/data
|
||||
SCHEDULE=0 0 * * 0
|
||||
LOG_LEVEL=info
|
||||
LOG_JSON=false
|
@ -1,36 +0,0 @@
|
||||
TZ=Europe/Paris
|
||||
PUID=1000
|
||||
PGID=1000
|
||||
|
||||
MEMORY_LIMIT=256M
|
||||
UPLOAD_MAX_SIZE=16M
|
||||
OPCACHE_MEM_SIZE=128
|
||||
MAX_FILE_UPLOADS=50
|
||||
REAL_IP_FROM=0.0.0.0/32
|
||||
REAL_IP_HEADER=X-Forwarded-For
|
||||
LOG_IP_VAR=remote_addr
|
||||
|
||||
XMLRPC_AUTHBASIC_STRING=rTorrent XMLRPC restricted access
|
||||
RUTORRENT_AUTHBASIC_STRING=ruTorrent restricted access
|
||||
WEBDAV_AUTHBASIC_STRING=WebDAV restricted access
|
||||
|
||||
RT_LOG_LEVEL=info
|
||||
RT_LOG_EXECUTE=false
|
||||
RT_LOG_XMLRPC=false
|
||||
|
||||
RU_REMOVE_CORE_PLUGINS=erasedata,httprpc
|
||||
RU_HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 6.0; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
|
||||
RU_HTTP_TIME_OUT=30
|
||||
RU_HTTP_USE_GZIP=true
|
||||
RU_RPC_TIME_OUT=5
|
||||
RU_LOG_RPC_CALLS=false
|
||||
RU_LOG_RPC_FAULTS=true
|
||||
RU_PHP_USE_GZIP=false
|
||||
RU_PHP_GZIP_LEVEL=2
|
||||
RU_SCHEDULE_RAND=10
|
||||
RU_LOG_FILE=/data/rutorrent/rutorrent.log
|
||||
RU_DO_DIAGNOSTIC=true
|
||||
RU_SAVE_UPLOADED_TORRENTS=true
|
||||
RU_OVERWRITE_UPLOADED_TORRENTS=false
|
||||
RU_FORBID_USER_SETTINGS=false
|
||||
RU_LOCALE=UTF8
|
@ -1,46 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
##========================================================================================##
|
||||
## Script bridgemacvlan-interface.sh ##
|
||||
## ##
|
||||
## Script de création d'interface virtuelle pour le conteneur AdGuardHome_macvlan ##
|
||||
## Voir tuto : https://www.nas-forum.com/forum/topic/69319-tuto-docker-macvlan-pi-hole/ ##
|
||||
## ##
|
||||
## Rappels des différentes IP : ##
|
||||
## - Plage d'IP macvlan : 192.168.xxx.MMM/28 ##
|
||||
## - IP virtuelle unique : 192.168.xxx.zzz/32 ##
|
||||
## - IP conteneur n°1 : 192.168.xxx.yyy ##
|
||||
## - IP conteneur n°2 : 192.168.xxx.ooo ##
|
||||
## - Plage d'IP du LAN : 192.168.xxx.0/24 ##
|
||||
## - Passerelle/routeur : 192.168.xxx.1 ##
|
||||
## ##
|
||||
##==========================================================================================
|
||||
|
||||
# Set timeout to wait host network is up and running
|
||||
sleep 60
|
||||
|
||||
echo "$(date "+%R:%S - ") Script de création d'une interface virtuelle pour le NAS"
|
||||
echo "$(date "+%R:%S - ") Exécution des commandes..."
|
||||
|
||||
ip link add macv0 link ovs_eth0 type macvlan mode bridge # macv0 : est le nom données à l'interface virtuelle
|
||||
# ovs_eth0 : est l'interface réseau utilisée sur le NAS (lorsque VMM est utilisé)
|
||||
ip addr add 192.168.xxx.zzz/32 dev macv0 # Adresse IP virtuelle 192.168.x.zzz/32 -- Il faut que cette adresse soit libre dans le réseau
|
||||
# et qu'elle ne fasse pas partie du DHCP du routeur/box
|
||||
|
||||
ip link set dev macv0 address 5E:00:01:02:03:04 # MAC adresse pour l'adaptateur ayant l'IP virtuelle
|
||||
# Il faut que l'adresse MAC respecte ces conditions :
|
||||
# - Elle n'existe pas déjà sur mon hôte et sur mon réseau.
|
||||
# - Elle respecte la base hexadécimale, les notations allant de 0 à F.
|
||||
# - Le premier nombre doit être pair, ici 5E = 94 en base 10, c'est donc OK (vous pouvez
|
||||
# utiliser un convertisseur en ligne, ou faire vos divisions euclidiennes).
|
||||
# S'il est impair, vous aurez un message :
|
||||
# RTNETLINK answers: Cannot assign requested address
|
||||
ip link set macv0 up
|
||||
|
||||
ip route add 192.168.xxx.MMM/28 dev macv0 # 192.168.xxx.MMM/28 : Plage d'adresse macvlan
|
||||
# IP réellement disponible : voir les calculateurs internet
|
||||
# Utiliser Portainer ou l'interface Docker ou encore le script : create-macvlan-network.sh
|
||||
|
||||
|
||||
echo "$(date "+%R:%S - ") Script terminé"
|
||||
exit
|
@ -1,85 +0,0 @@
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Fichier docker-compose.yml pour Pi-Hole en macvlan ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##============================================================================================##
|
||||
## ##
|
||||
## Attention, il faut créer le réseau macvlan à l'aide du script : macvlan-network.sh ##
|
||||
## Ce dernier va créer un réseau macvlan ayant comme IP unique 192.168.2.211 ##
|
||||
## Cette IP doit être dans la plage d'IP mavclan définie dans le script de création du réseau.##
|
||||
## Le conteneur sera donc vu comme une machine sur le réseau LAN, mais ne pourra pas être ##
|
||||
## joint par le NAS lui-même. ##
|
||||
## Pour celà, il faut utiliser le second script : boot-bridgemacvlan-interface.sh ##
|
||||
## Ce dernier va créer une IP-interface virtuelle qui pourra être accessible par le NAS. ##
|
||||
## Cette interface ne persiste pas au démarrage, il faudra mettre le script en tâche ##
|
||||
## planifiée avec le planificateur de tâches dans DSM. ##
|
||||
## ##
|
||||
## Voir tuto : https://www.nas-forum.com/forum/topic/69319-tuto-docker-macvlan-pi-hole/ ##
|
||||
## ##
|
||||
## Attention ! ##
|
||||
## ##
|
||||
## Ces deux scripts ne sont à utiliser qu'une seule fois, quelque soit le nombre de ##
|
||||
## conteneurs qui en bénéficieront. ##
|
||||
## Par exemple, si vous utilisez 2 conteneurs en macvlan, une fois le réseau macvlan créé ##
|
||||
## pour le 1er, il est inutile (et impossible) de le recréer. ##
|
||||
## Le script boot-bridgemacvlan-interface.sh ne doit être lancé qu'une seule fois, et à ##
|
||||
## chaque reboot. L'IP virtuelle est unique, il ne faut pas en recréer une seconde. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
|
||||
---
|
||||
version: "2.4"
|
||||
services:
|
||||
pihole_macvlan:
|
||||
image: pihole/pihole # https://hub.docker.com/r/pihole/pihole
|
||||
# https://github.com/pi-hole/docker-pi-hole
|
||||
# https://github.com/pi-hole/docker-pi-hole/#environment-variables
|
||||
container_name: pihole_macvlan
|
||||
|
||||
hostname: pi-hole-BLABLA # C'est le nom que vous verrez en haut à droite dans l'UI.
|
||||
|
||||
environment:
|
||||
- ADMIN_EMAIL=email@ndd.tld
|
||||
- TZ=Europe/Paris
|
||||
# Les deux lignes suivantes sont dépréciées, et ne doivent plus être utilisées. Voir ici : https://github.com/pi-hole/docker-pi-hole/#deprecated-environment-variables
|
||||
#- DNS1=80.67.169.12 # IP des serveurs DNS FdN
|
||||
#- DNS2=9.9.9.9 # IP Quad9
|
||||
# Les deux lignes précédentes sont remplacées par la suivante
|
||||
- PIHOLE_DNS_=80.67.169.12;9.9.9.9
|
||||
- DNSSEC=false # Passer à true si les serveurs DNS gèrent le DNSSEC.
|
||||
- DNS_BOGUS_PRIV=true
|
||||
- DNS_FQDN_REQUIRED=true
|
||||
- DNSMASQ_LISTENING=local
|
||||
- INTERFACE=ovs_eth0 # Remplacer par votre interface réseau
|
||||
- REV_SERVER=true # Permet de recuperer les noms d hote des peripheriques du reseau
|
||||
- REV_SERVER_TARGET=192.168.2.1 # Voir paragraphe CONDITIONAL FORWARDING
|
||||
- REV_SERVER_CIDR=192.168.2.0/24 # Votre sous-reseau local
|
||||
#- REV_SERVER_DOMAIN=ndd.tld # Domaine local (Je n'utilise pas, donc je commente)
|
||||
- TEMPERATUREUNIT=C
|
||||
- WEBUIBOXEDLAYOUT=boxed
|
||||
- ServerIP=192.168.2.211 # IP du conteneur Pi-hole
|
||||
- VIRTUAL_HOST=pi.hole # Si on souhaite acceder a Pi-hole par un nom de domaine (proxy inverse par exemple)
|
||||
- WEBPASSWORD=xxxxxxxxxxxxxxxx
|
||||
|
||||
volumes:
|
||||
- /volume1/docker/pihole_macvlan/etc-pihole:/etc/pihole/
|
||||
- /volume1/docker/pihole_macvlan/etc-dnsmasq.d:/etc/dnsmasq.d/
|
||||
|
||||
# La section suivante ne me semble pas utile, compte tenu du fonctionnement du conteneur
|
||||
# Je la laisse mais en commentée.
|
||||
#dns:
|
||||
# - 127.0.0.1
|
||||
# - 80.67.169.12
|
||||
|
||||
networks:
|
||||
macvlan-network:
|
||||
ipv4_address: 192.168.2.211 # Mettre ici l'IP macvlan dans la plage définie dans les scripts
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
macvlan-network: # Ce réseau devra bien entendu être créé avant avec le script
|
||||
external: true
|
@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
##============================================================================================##
|
||||
## Script macvlan-network.sh ##
|
||||
## ##
|
||||
## Script de création d'interface virtuelle pour les conteneurs Swag at AdGuard Home ##
|
||||
## Voir tutos : ##
|
||||
## https://www.nas-forum.com/forum/topic/69319-tuto-docker-macvlan-pi-hole/ ##
|
||||
## ##
|
||||
## Les IPs prévues pour les conteneurs sont : ##
|
||||
## - AdGuard-Home : 192.168.xxx.yyy ##
|
||||
## - Pi-Hole : 192.168.xxx.ooo ##
|
||||
## ##
|
||||
## Rappels des différentes IP : ##
|
||||
## - Plage d'IP macvlan : 192.168.xxx.MMM/28 ##
|
||||
## - IP virtuelle unique : 192.168.xxx.zzz/32 ##
|
||||
## - IP conteneur n°1 : 192.168.xxx.yyy ##
|
||||
## - IP conteneur n°2 : 192.168.xxx.ooo ##
|
||||
## - Plage d'IP du LAN : 192.168.xxx.0/24 ##
|
||||
## - Passerelle/routeur : 192.168.xxx.1 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## --ip-range=192.168.xxx.MMM/28 : cela correspond à la plage d'IP pour le réseau macvlan ##
|
||||
## sachant que 192.168.xxx.MMM doit être la 1ère IP donnée par les calculateurs internet. ##
|
||||
## Il se peut que ce ne soit pas la même que l'IP macvlan que l'on veut donner au conteneur ##
|
||||
## AdGuardHome. ##
|
||||
## ##
|
||||
## Quelques calculateurs internet : ##
|
||||
## https://cric.grenoble.cnrs.fr/Administrateurs/Outils/CalculMasque/ ##
|
||||
## https://www.cidr.eu/en/calculator/+/192.168.2.208/28 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
|
||||
docker network create -d macvlan \
|
||||
--subnet=192.168.xxx.0/24 \
|
||||
--ip-range=192.168.xxx.MMM/28 \
|
||||
--gateway=192.168.xxx.1 \
|
||||
-o parent=ovs_eth0 \ # Ici, ovs_eth0 est à remplacer par votre interface réseau : eth0 ou autre...
|
||||
macvlan-network
|
@ -1,17 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de modification de permissions sur l'interface de l'IGPU du NAS
|
||||
# Pour que le media-serveur puisse transcoder avec le hardware.
|
||||
|
||||
#Startup Script
|
||||
#Access for HW Decoder Plex/Emby/Jellyfin
|
||||
echo -e "\n$(date "+%R:%S -") Script de modification de permissions sur l'interface de l'IGPU du NAS\n"
|
||||
echo -e "$(date "+%R:%S -") Lancement de la commande : sudo chmod 660 /dev/dri/card0 /dev/dri/renderD128\n"
|
||||
|
||||
if [ -d /dev/dri ]; then
|
||||
sudo chmod 660 /dev/dri/renderD128
|
||||
fi
|
||||
|
||||
echo -e "$(date "+%R:%S -") Script terminé\n"
|
||||
|
||||
exit 0
|
@ -1,30 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: "2.1"
|
||||
|
||||
services:
|
||||
plex:
|
||||
image: ghcr.io/linuxserver/plex # Ancien dépôt : linuxserver/plex:latest
|
||||
container_name: plex
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: 'plex_network'
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- VERSION=latest
|
||||
- UMASK=022
|
||||
# Si plex est en mode HOST, la ligne suivante n'est pas nécessaire.
|
||||
# - PLEX_CLAIM=BLABLA #obtain claim token https://plex.tv/claim expire within 4 minutes.
|
||||
volumes:
|
||||
- /volume1/docker/plex/config:/config
|
||||
- /volume1/docker/plex/transcode:/transcode
|
||||
- /volume1/media/music:/data/music
|
||||
- /volume1/media/movies:/data/movies
|
||||
- /volume1/media/tvshow:/data/tvshow
|
||||
# Decommenter les 2 lignes suivantes pour activer le transcodage matériel iGPU( si NAS/serveur compatible )
|
||||
# devices:
|
||||
# - /dev/dri:/dev/dri
|
||||
restart: unless-stopped
|
@ -1,58 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-04-11
|
||||
version: "2.1"
|
||||
services:
|
||||
plex:
|
||||
image: ghcr.io/linuxserver/plex # Ancien dépôt : linuxserver/plex:latest
|
||||
container_name: plex
|
||||
network_mode: host
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- VERSION=latest
|
||||
- UMASK=022
|
||||
# Si plex est en bridge ( autre que "network_mode: host" )), les 12 lignes suivantes doivent être décommentées et le token renseigné.
|
||||
# - PLEX_CLAIM=BLABLA #obtain claim token https://plex.tv/claim expire within 4 minutes.
|
||||
# ports:
|
||||
# - 32400:32400
|
||||
# - 1900:1900/udp
|
||||
# - 3005:3005
|
||||
# - 5353:5353/udp
|
||||
# - 8324:8324
|
||||
# - 32410:32410/udp
|
||||
# - 32412:32412/udp
|
||||
# - 32413:32413/udp
|
||||
# - 32414:32414/udp
|
||||
# - 32469:32469
|
||||
volumes:
|
||||
- /volume1/docker/plex/config:/config
|
||||
- /volume1/docker/plex/transcode:/transcode
|
||||
- /volume1/media/music:/data/music
|
||||
- /volume1/media/movies:/data/movies
|
||||
- /volume1/media/tvshow:/data/tvshow
|
||||
# Decommenter les 2 lignes suivantes pour activer le transcodage matériel iGPU( si NAS/serveur compatible )
|
||||
# devices:
|
||||
# - /dev/dri:/dev/dri
|
||||
restart: unless-stopped
|
||||
|
||||
tautulli:
|
||||
image: ghcr.io/linuxserver/tautulli # Ancien dépôt : linuxserver/tautulli:latest
|
||||
container_name: tautulli
|
||||
network_mode: host
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
# Si plex est en bridge ( autre que "network_mode: host" ), les 2 lignes suivantes doivent être décommentées.
|
||||
# ports:
|
||||
# - 8181:8181
|
||||
volumes:
|
||||
- /volume1/docker/tautulli/config:/config
|
||||
- /volume1/docker/plex/config/Library/Application Support/Plex Media Server/Logs:/logs
|
||||
restart: unless-stopped
|
@ -1,18 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-05
|
||||
version: '3.3'
|
||||
services:
|
||||
privatebin:
|
||||
ports:
|
||||
- '80:80' # WebUI
|
||||
container_name: privatebin
|
||||
volumes:
|
||||
- '/volume1/docker/privatebin/data:/privatebin/data'
|
||||
- '/volume1/docker/privatebin/cfg:/privatebin/cfg'
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: jgeusebroek/privatebin
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: prod
|
@ -1,22 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-03
|
||||
version: '3.3'
|
||||
services:
|
||||
psitransfer:
|
||||
container_name: psitransfer
|
||||
volumes:
|
||||
- '/volume1/docker/psitransfer/data:/data'
|
||||
ports:
|
||||
- '3000:3000' # WebUI
|
||||
environment:
|
||||
- PSITRANSFER_UPLOAD_PASS=VOTRE_MOT_DE_PASSE # Commenter ligne pour ne pas avoir besoin de mots de passe
|
||||
- PSITRANSFER_DEFAULT_LANGUAGE=fr # Le language de l'interface
|
||||
- PSITRANSFER_ADMIN_PASS=OTRE_MOT_DE_PASSE_ADMIN # A choisir judicieusement
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: psitrax/psitransfer
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: psitransfer_network
|
@ -1,26 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-03
|
||||
version: '3.3'
|
||||
services:
|
||||
linuxserver:
|
||||
container_name: qbittorrent
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
- UMASK_SET=022
|
||||
- WEBUI_PORT=8181 # Web interface
|
||||
ports:
|
||||
- '6881:6881'
|
||||
- '6881:6881/udp'
|
||||
- '8181:8181' # WebUI
|
||||
volumes:
|
||||
- '/volume1/docker/qbitorrent/config:/config'
|
||||
- '/volume1/docker/share:/share' # Repertoire d'enregistrement
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: ghcr.io/linuxserver/qbittorrent
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: qbitorrent_network
|
@ -1,23 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-13
|
||||
version: '3.3'
|
||||
services:
|
||||
linuxserver:
|
||||
container_name: radarr
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
- UMASK_SET=002
|
||||
ports:
|
||||
- '7878:7878' # WebUI
|
||||
volumes:
|
||||
- '/volume1/docker/radarr/config:/config'
|
||||
- '/volume1/docker/share:/share' # Emplacement de vos partages
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: 'ghcr.io/linuxserver/radarr:latest'
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: radarr_network
|
@ -1,22 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-05
|
||||
version: '3.3'
|
||||
services:
|
||||
requestrr:
|
||||
container_name: requestrr
|
||||
ports:
|
||||
- '4545:4545' # WebUI
|
||||
volumes:
|
||||
- /volume1/docker/requestrr/config:/config
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- UMASK=002
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: 'hotio/requestrr:latest'
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: requestrr_network
|
@ -1,37 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-04-20
|
||||
|
||||
version: "2.1"
|
||||
services:
|
||||
scrutiny:
|
||||
image: ghcr.io/linuxserver/scrutiny
|
||||
container_name: scrutiny
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
networks:
|
||||
- scrutiny-network
|
||||
cap_add:
|
||||
- SYS_RAWIO
|
||||
- SYS_ADMIN
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=100
|
||||
- TZ=Europe/Paris
|
||||
- SCRUTINY_API_ENDPOINT=http://localhost:8080
|
||||
- SCRUTINY_WEB=true
|
||||
- SCRUTINY_COLLECTOR=true
|
||||
volumes:
|
||||
- /srv/disk1/docker/scrutiny/config:/config
|
||||
- /run/udev:/run/udev:ro
|
||||
ports:
|
||||
- 8080:8080
|
||||
devices:
|
||||
- /dev/sda:/dev/sda
|
||||
- /dev/sdb:/dev/sdb
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
scrutiny-network:
|
||||
external:
|
||||
name: scrutiny-network
|
@ -1,23 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-13
|
||||
version: '3.3'
|
||||
services:
|
||||
linuxserver:
|
||||
container_name: sonarr
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
- UMASK_SET=002
|
||||
ports:
|
||||
- '8989:8989' # WebUI
|
||||
volumes:
|
||||
- '/volume1/docker/sonarr/config:/config'
|
||||
- '/volume1/docker/share:/share' # Emplacement de vos partages
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: 'ghcr.io/linuxserver/sonarr:latest'
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: sonarr_network
|
@ -1,22 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: '3.3'
|
||||
services:
|
||||
speedtest-tracker:
|
||||
container_name: speedtest
|
||||
ports:
|
||||
- '80:80' # WebUI
|
||||
volumes:
|
||||
- '/volume1/docker/speedtest/config:/config'
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- OOKLA_EULA_GDPR=true
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: henrywhitaker3/speedtest-tracker
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: 'speedtest_network'
|
@ -1,31 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-03-06
|
||||
version: "2.1"
|
||||
|
||||
services:
|
||||
syncthing:
|
||||
image: ghcr.io/linuxserver/syncthing
|
||||
container_name: syncthing
|
||||
hostname: syncthing #optional
|
||||
networks:
|
||||
- syncthing_network
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=100 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- /volume1/docker/syncthing/config:/config
|
||||
- /volume1/docker/syncthing/data:/data
|
||||
ports:
|
||||
- 8384:8384
|
||||
- 22000:22000
|
||||
- 21027:21027/udp
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
syncthing_network:
|
||||
external:
|
||||
name: syncthing_network
|
@ -1,22 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: '3.3'
|
||||
services:
|
||||
tautulli:
|
||||
container_name: tautulli
|
||||
environment:
|
||||
- PUID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PGID=1000 # Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- TZ=Europe/Paris # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
ports:
|
||||
- '8181:8181' # WebUI
|
||||
volumes:
|
||||
- '/volume1/docker/tautulli/config:/config'
|
||||
- '/volume1/docker/plexlogs:/mnt' # Emplacement de votre dossier plexlogs
|
||||
restart: unless-stopped
|
||||
# Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur
|
||||
# labels:
|
||||
# - com.centurylinklabs.watchtower.enable=true
|
||||
image: 'ghcr.io/linuxserver/tautulli:latest' # Ancien dépôt : linuxserver/tautulli:latest
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: 'tautulli_network'
|
@ -1,681 +0,0 @@
|
||||
[size=200][color=#800000][b]( [u] > TUTO mis à jour - v4.3 < [/u] )[/b][/color][/size]
|
||||
[color=#800000][list][*] 3.1 : ajout d'une capture d'écran de la configuration du reverse-proxy de DSM + ajout d'une mention concernant ce qui est à remplacer dans le docker-compose.yml
|
||||
[*] 4.0 : changement d'image pour le backup, donc le docker-compose est modifié.`
|
||||
[*] 4.1 : actualisation de certaines captures d'écrans
|
||||
[*] 4.2 : correction de quelques coquilles, et mise à jour de la ligne de commande de création des dossiers en ligne de commande.
|
||||
[*] 4.3 : Ajout d'un avertissement + explications pour la variable SIGNUPS_ALLOWED=false dans mon tuto
|
||||
[/list][/color]
|
||||
|
||||
Bonjour à toutes et à tous,
|
||||
|
||||
|
||||
|
||||
[color=#4040BF][b][size=200]Sommaire :[/size][/b]
|
||||
0. Fichiers joints
|
||||
1. Note à lire : Mise à jour v3.0 (changement de nom de l'image)
|
||||
2. Préambule & Prérequis
|
||||
3- Mise en place et création des conteneurs [color=#800000][b]( [u] > Mise à jour v4.0 < [/u] )[/b][/color]
|
||||
3.1- Petites explications sur ce qui suivra
|
||||
3.2- Création du docker-compose.yml [color=#800000][b]( [u] > Mise à jour v4.0 < [/u] )[/b][/color]
|
||||
3.3- Configuration de rclone pour le backup [color=#800000][b]( [u] > Mise à jour v4.0 < [/u] )[/b][/color]
|
||||
3.4- Création des dossiers et du réseau
|
||||
3.5- Création des conteneurs (2 méthodes)
|
||||
4- 1er lancement et sécurisation 2FA
|
||||
5- Ajout d'un script pour les notifications Websocket [color=#800000][b]( [u] > Ajout v3.0 < [/u] )[/b][/color]
|
||||
5.1- Explications : Pourquoi ? Comment ? [color=#800000][b]( [u] > Ajout v3.0 < [/u] )[/b][/color]
|
||||
5.2- Comment lancer le script ? [color=#800000][b]( [u] > Ajout v3.0 < [/u] )[/b][/color]
|
||||
5.3- Enfin le script lui même ! [color=#800000][b]( [u] > Ajout v3.0 < [/u] )[/b][/color]
|
||||
...
|
||||
[/color]
|
||||
|
||||
[color=#BF40BF][b][size=200]0. Fichiers joints[/size][/b][/color]
|
||||
[list]
|
||||
[*] docker-compose-v1.0.yml (plus maintenu, mais laissé pour la postérité) : [attachment=5]docker-compose-v1.0.yml.7z[/attachment]
|
||||
[*] docker-compose-v2.0.yml (plus maintenu, mais laissé pour la postérité) : [attachment=4]docker-compose-v2.0.yml.7z[/attachment]
|
||||
[*] docker-compose-v3.0.yml (plus maintenu, mais laissé pour la postérité) : [attachment=3]docker-compose-v3.0.yml.7z[/attachment]
|
||||
[*] docker-compose-v4.0.yml (La dernière version) : [attachment=1]docker-compose-v4.0.yml.7z[/attachment]
|
||||
[*] Le fichier rclone.conf : [attachment=0]config-rclone.conf.7z[/attachment]
|
||||
[*] Le script pour les notifications Websockets : [attachment=2]vaultwarden__Enable_Websocket.7z[/attachment]
|
||||
|
||||
[/list]
|
||||
|
||||
|
||||
[color=#BF40BF][b][size=200]1. Note à lire : Mise à jour v3.0 (changement de nom de l'image)[/size][/b][/color]
|
||||
L'auteur de Bitwarden_RS, dani-garcia, a renommé son image en Vaultwarden.
|
||||
[quote][img]https://gitlab.com/BZHDeveloper/HFR/raw/master/emojis-micro/1f4e2.png[/img] Note: This project was known as Bitwarden_RS and has been renamed to separate itself from the official Bitwarden server in the hopes of avoiding confusion and trademark/branding issues. Please see [url=https://github.com/dani-garcia/vaultwarden/discussions/1642]#1642[/url] for more explanation.[/quote]
|
||||
Je viens de mettre à jour l'intégralité du tuto pour que tout soit cohérent avec ce nouveau nom. Les noms des dossiers, fichier log, nom du conteneur, du réseau etc, sont donc renommé pour tenir compte du nouveau nom.
|
||||
Pour ceux qui veulent aller vite :
|
||||
[list=1]
|
||||
[*] Arrêter le conteneur Bitwarden_RS
|
||||
[*] Faire une copie de sauvegarde du dossier complet .../docker/bitwarden_rs
|
||||
[*] Renommer les trois dossiers en remplaçant bitwarden (ou bitwarden_rs) par vaultwarden : bitwarden_rs/bitwarden-data/
|
||||
[list]
|
||||
[*] bitwarden_rs/bitwarden-data/ ---> vaultwarden/vaultwarden-data/
|
||||
[*] bitwarden_rs/bitwarden-backup ---> vaultwarden/vaultwarden-backup/
|
||||
[/list]
|
||||
[*] Supprimer la stack dans Portainer, ou supprimer le conteneur via la ligne de commande.
|
||||
[*] Créer une nouvelle stack dans Portainer avec le fichier docker compose v3.0 (pensez à modifier les valeurs perso).
|
||||
[*] Vous reconnecter.
|
||||
[*] Annexe : si vous souhaitez changer de nom de domaine, créer le nouveau, et mettez le dans le docker-compose à la place de l'ancien.
|
||||
[/list]
|
||||
|
||||
|
||||
[color=#BF40BF][b][size=200]2- Préambule & Prérequis[/size][/b][/color]
|
||||
Tout d'abord, pourquoi je fais un nouveau tuto d'installation de [url=https://github.com/dani-garcia/vaultwarden]vaultwarden[/url]... En fait je n'ai pas vu de tuto vraiment à mon goût sur l'installation de [url=https://github.com/dani-garcia/vaultwarden]vaultwarden[/url], soit il manque des explications, soit c'est fait via l'interface DSM de docker... Donc je me décide à en faire un moi-même.
|
||||
Je précise qu'il n'y aura pas beaucoup de différences avec ceux trouvés sur le NET, si ce n'est ceci :
|
||||
[list]
|
||||
[*] L'utilisation de Portainer ou de la ligne de commande (=CLI) avec docker-compose
|
||||
[*] Des commentaires expliquants la plupart des options utilisées tout le long du docker-compose.yml
|
||||
[*] Une utilisation combinée avec un conteneur faisant automatiquement des sauvegardes de la base de données, là aussi avec des commentaires dans le docker-compose.yml : [url]https://gitlab.com/1O/vaultwarden-backup[/url]
|
||||
[/list]
|
||||
|
||||
|
||||
Pour mettre en oeuvre ce tuto, il faudra au préalable :
|
||||
[list][*] que vous ayez mis en place [b][u]Portainer[/u][/b] ([url=https://www.forum-nas.fr/viewtopic.php?f=56&t=14030]voir le tuto d'EVOTk[/url]) ;
|
||||
[*] que vous sachiez vous connecter en SSH au NAS et lancer [i]docker-compose up -d[/i] si vous optez pour la création des conteneurs en ligne de commande (vous trouverez ici un tuto explicatif : [url=https://www.forum-nas.fr/viewtopic.php?f=56&t=11461][Tuto] Acceder à son NAS en lignes de commande[/url]) ;
|
||||
[*] savoir identifier les PUID et PGID d'un utilisateur avec une ligne de commande en SSH sur le NAS.
|
||||
[/list]
|
||||
|
||||
|
||||
[size=200][color=#BF40BF][b]43- Mise en place et création des conteneurs[/b][/color] [color=#800000][b]( [u] > Mise à jour < [/u] )[/b][/color][/size]
|
||||
|
||||
[color=#BF40BF][b][size=150]3.1- Petites explications sur ce qui suivra[/size][/b][/color]
|
||||
|
||||
Le but de ce tuto est de tout préparer sur l'ordinateur avant de placer les fichiers/dossiers au bon endroit, tout en comprenant bien ce qui est fait et les implications de certaines options.
|
||||
On va tout d'abord commencer par créer un fichier [i]docker-compose.yml[/i] qui pourra servir pour les deux méthodes d'installation (Portainer, ou CLI).
|
||||
J'opte pour combiner la création des deux conteneurs ([b]vaultwarden[/b] et [b]vaultwarden Backup[/b]) en un seul fichier [i]docker-compose.yml[/i]. J'ai également choisi de placer ces deux conteneurs dans un même réseau (network) que je nomme [i]vaultwarden_network[/i].
|
||||
Ensuite il faudra créer ce réseau et les dossiers utilisés avant de créer les conteneurs.
|
||||
Pour les dossiers, je pars sur cette organisation : (sur le volume1)
|
||||
[url=https://i.imgur.com/xs3kngV.png][img]https://i.imgur.com/xs3kngV.png[/img][/url]
|
||||
(Note : j'ai conservé pour quelques semaines encore, l'ancien dossier de backup : vaultwarden_backup, il n'est pas nécessaire pour vous de le créer...)
|
||||
|
||||
[b][color=#800000]Note : Tout ce qui sera XXxxXX sera à remplacer par vos valeurs. J'indiquerais comment les obtenir si ce n'est pas évident.[/color][/b]
|
||||
|
||||
[size=150][color=#BF40BF][b]3.2- Création du docker-compose.yml[/b][/color] [color=#800000][b]( [u] > Mise à jour < [/u] )[/b][/color][/size]
|
||||
Voir le fichier ci-joint dans le §0.
|
||||
[size=150][color=#800000][b]( Dans la mise à jour du tuto (v2.0), j'ai ajouté pas mal de commentaires dans le fichier docker-compose.yml. Lisez-les attentivement )[/b][/color][/size]
|
||||
|
||||
Ce fichier est composé de trois parties : une partie dédiée à vaultwarden et à sa configuration, et une autre partie dédiée à vaultwarden backup et à sa configuration, et enfin une pour le réseau.
|
||||
|
||||
[u][b]Explications sur la partie configuration ([b][color=#4040FF]partie 1[/color][/b]) de vaultwarden (1ère partie du docker-compose.yml) :[/b][/u]
|
||||
|
||||
Ce qui suit met en place la version de docker-compose à utiliser : pour plus de compatibilité (et par simplicité car je ne maitrise pas la v3...) on part sur une v2.
|
||||
|
||||
[color=#13A8BD]Il y a dans l'extrait ci-dessous des commentaires qui permettent de comprendre ce qui est fait.
|
||||
Il faudra remplacer les [b]XXxxXX[/b] par vos valeurs à vous.
|
||||
[/color]
|
||||
|
||||
[size=150][color=#BF0040][b][u]Avertissement concernant la variable SIGNUPS_ALLOWED[/u][/b][/color][/size]
|
||||
[color=#BF0040]Dans la partie du docker-compose concernant Vaultwarden, il y a une variable d'environnement particulière qui bloque l'inscription de nouveaux comptes si elle a comme valeur false :[/color]
|
||||
[code]- SIGNUPS_ALLOWED=false[/code]
|
||||
[color=#BF0040]Ce faisant, il vous sera impossible de créer votre premier compte via l'interface web de Vaultwarden si vous la laissez sur [b]false[/b].
|
||||
[b][i]Mais...[/i][/b] Il y a deux possibilités pour quand même avoir un compte (sinon ce n'est pas très utile comme outils...).
|
||||
[list][*] La première est peut-être la plus pratique : il suffit d'aller dans l'interface admin ( https://votre-nom-de-domaine.tld/admin ) en utilisant le ADMIN_TOKEN, et de remplir le champ email dans "Invite User" avec votre email pour vous "auto-inviter". Il faut bien entendu que l'envoi d'email soit fonctionnel, ce qui sera obligatoire pour le 2FA.
|
||||
[img]https://i.imgur.com/wquYyII.png[/img]
|
||||
|
||||
|
||||
|
||||
[*] La deuxième méthode c'est de mettre la variable SIGNUPS_ALLOWED sur true :[/color]
|
||||
[code]- SIGNUPS_ALLOWED=true[/code]
|
||||
[color=#BF0040] Et là aussi, deux possibilités :
|
||||
[list][*] Soit vous créer de base le conteneur cette variable sur true, et alors au premier lancement vous pourrez créer votre compte. Mais il faudra ensuite soit passer par l'interface admin pour passer le paramètre "Allow new signups" à false en décochant la case à cocher (chez moi c'est par défaut à false à cause de la variable SIGNUPS_ALLOWED).
|
||||
[url=https://i.imgur.com/oYxpiwZ.png][img]https://i.imgur.com/oYxpiwZ.png[/img][/url]
|
||||
|
||||
[*] Soit vous modifiez (après le premier lancement et la création du compte) le docker-compose en repassant la variable SIGNUPS_ALLOWED à false, et vous recréez le conteneur. [/list]
|
||||
[/list]
|
||||
|
||||
Quoique vous fassiez, je vous conseil vivement de désactiver l'inscription via la variable SIGNUPS_ALLOWED, et d'inviter chaque utilisateur avec la console admin, puis de désactiver la console admin en commentant la variable ADMIN_TOKEN (donc en recréant le conteneur). (ce n'est qu'un conseil).
|
||||
[/color]
|
||||
|
||||
|
||||
|
||||
|
||||
[code]##==============================================================================================
|
||||
## ##
|
||||
## Fichier docker-compose.yml pour Vaultwarden avec ttionya/vaultwarden-backup ##
|
||||
## Révision du fichier : v4.0 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Attention, avec ce fichier, il faut avoir créer le réseau "vaultwarden_network" avant de ##
|
||||
## créer les conteneurs. ##
|
||||
## ##
|
||||
## La mise en place de fail2ban se fera avec un docker-compose dédié. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## NOTE IMPORTANTE ##
|
||||
## ----------------- ##
|
||||
## ##
|
||||
## Lors de l'importation d'un fichier contenant beaucoup d'entrées, j'ai eu une erreur ##
|
||||
## 405 Not Allowed - Nginx ##
|
||||
## Après quelques recherches, et un certains nombre de minutes, il s'est avéré que les ##
|
||||
## expiration du délai ... (les timeout) dans le reverse proxy par défaut de 60s étaient ##
|
||||
## trop faible. ##
|
||||
## En passant les 3 valeurs à 300s (5min), ça a réglé mon problème. ##
|
||||
## (Pensez à relancer le script vaultwarden__Enable_Websocket.sh après ces modifications) ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Ajout des Notifications Websocket ##
|
||||
## ##
|
||||
## Pour qu'elles'fonctionnent, il faut configurer le reverse-proxy correctement. ##
|
||||
## Pour celui de DSM, il n'est malheureusement pas possible de configurer les ##
|
||||
## redirections /notifications/hub vers le serveur WebSocket ni celles vers le port normal ##
|
||||
## /notifications/hub/negotiate ##
|
||||
## Voir cet article pour tout ce qui n'est pas possible via l'interface de DSM : ##
|
||||
## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ##
|
||||
## ##
|
||||
## Dès lors, il faut ruser et passer par l'exécution d'un petit script qui va créer un ##
|
||||
## fchier ws.locations contenant les modifications précédentes, et qui va écrire une ##
|
||||
## ligne dans le fichier /etc/nginx/app.d/server.ReverseProxy.conf pour inclure le ##
|
||||
## fichier ws.locations au niveau de la section concernant le nom de domaine pour ##
|
||||
## vaultwarden. ##
|
||||
## Comme cela, il n'est pas nécessaire de passer par le changement de reverse-proxy, assez ##
|
||||
## complexe à mettre en oeuvre... ##
|
||||
## ##
|
||||
## Le script est : vaultwarden__Enable_Websocket.sh ##
|
||||
## ##
|
||||
## Il faudra la lancer régulièrement et à chaque redémarrage du NAS, via deux tâches ##
|
||||
## plannifiées dédiées, en donnant 3 paramètres au fichier : ##
|
||||
## - le nom de domaine de vaultwarden ##
|
||||
## - le port HTTP exposé (donc pas l'interne du conteneur) pour l'interface graphique ##
|
||||
## - le port websocket exposé (donc pas l'interne du conteneur) ##
|
||||
## Voir les commentaires de ce fichier vaultwarden__Enable_Websocket.sh pour plus ##
|
||||
## d'explications. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
---
|
||||
version: "2.4"
|
||||
|
||||
services:
|
||||
vaultwarden:
|
||||
image: vaultwarden/server:latest # https://github.com/dani-garcia/vaultwarden
|
||||
# https://github.com/dani-garcia/vaultwarden/wiki
|
||||
container_name: vaultwarden
|
||||
networks:
|
||||
- vaultwarden_network
|
||||
environment:
|
||||
# Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PUID=1000
|
||||
- PGID=100
|
||||
- TZ=Europe/Paris
|
||||
|
||||
# Pour l'envoi d'emails
|
||||
- SMTP_HOST=XXxxXX
|
||||
- SMTP_FROM=XXxxXX
|
||||
- SMTP_FROM_NAME=BlaBla
|
||||
- SMTP_PORT=XXxxXX
|
||||
- SMTP_SSL=true
|
||||
- SMTP_USERNAME=XXxxXX
|
||||
- SMTP_PASSWORD=XXxxXX
|
||||
|
||||
- INVITATION_ORG_NAME=Vaultwarden [Votre Nom, pseudo...] # Permet de spécifier un nom d'application pour les invitations d'organisation
|
||||
|
||||
# Nécessaire pour activer le 2FA pour la connexion à notre serveur Vaultwarden
|
||||
# Il est possible de spécifier un port de connexion dans l'URL. Le https:// est obligatoire.
|
||||
# Pour cette option, il est donc OBLIGATOIRE d'avoir fait le nécessaire pour avoir du HTTPS (certificats, reverse-proxy, ...)
|
||||
- DOMAIN=XXxxXX
|
||||
|
||||
# Pour enregistrer les log avec un niveau particulier
|
||||
- LOG_FILE=/data/vaultwarden.log
|
||||
- LOG_LEVEL=warn
|
||||
- EXTENDED_LOGGING=true
|
||||
|
||||
# je n'aime pas les indices pour les mots de passe...
|
||||
- SHOW_PASSWORD_HINT=false
|
||||
|
||||
# Pour activer la console d'administation, accessible via : https://mon.domaine.tld/admin/
|
||||
# Voir détails ici : https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
|
||||
# /!\
|
||||
# /!\ N'importe qui pourra accéder à la page de connexion, alors blinder le token d'amdin ci-dessous (64 caractères pour moi) !
|
||||
# /!\ Il est de plus TRÈS important d'avoir ACTIVÉ le HTTPS avant l'activation de cette option.
|
||||
# /!\
|
||||
# Je conseille de ne l'activer qu'en cas de nécessité, et de la désactiver après.
|
||||
# Pour désactiver, il suffit de commenter la ligne ci-dessous.
|
||||
- ADMIN_TOKEN=XXxxXX
|
||||
# À noter :
|
||||
# La première fois que vous enregistrez un paramètre dans la page d'administration, 'config.json' sera généré
|
||||
# dans votre 'DATA_FOLDER'. Les valeurs de ce fichier auront priorité sur les valeurs 'environnement'.
|
||||
|
||||
- SIGNUPS_ALLOWED=false # Fait en sorte que les inscriptions soient bloquées, seul l'admin pourra inviter
|
||||
# des utilisateurs avec un envoi d'email depuis la console d'administation
|
||||
|
||||
- WEBSOCKET_ENABLED=true # Active les WebSocket notifications (Nécessite la configuration du reverse-proxy)
|
||||
# Durant le nombre importants d'essais, j'en suis venu à laisser le port par défaut
|
||||
# pour le WEBSOCKET_PORT. Il est possible que ça fonctionne avec un port différent.
|
||||
# Il faudra alors décommenter la ligne suivante, et changer le port exposé plus bas.
|
||||
#- WEBSOCKET_PORT=3012 # Par défaut = 3012
|
||||
|
||||
# Pour activer la récupération des icones des IP LAN, il faut mettre sur false la variable ICON_BLACKLIST_NON_GLOBAL_IPS
|
||||
- ICON_BLACKLIST_NON_GLOBAL_IPS=false # Par défaut = true
|
||||
|
||||
# On défini ici quelques chemins de dossiers qu'il faudra créer (pas sur que le conteneur les crées lui-même...)
|
||||
- ICON_CACHE_FOLDER=data/icon_cache
|
||||
- ATTACHMENTS_FOLDER=data/attachments
|
||||
- SENDS_FOLDER=data/sends
|
||||
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
|
||||
volumes:
|
||||
- "/volume1/docker/vaultwarden/vaultwarden-data/:/data/"
|
||||
ports:
|
||||
- XXxxXX:3012 # Choisir un port libre pour le websocket
|
||||
- XXxxXX:80 # Choisir un port libre pour l'interface WEB
|
||||
restart: unless-stopped
|
||||
[/code]
|
||||
|
||||
|
||||
[u][b]Maintenant la deuxième partie ([b][color=#4040FF]partie 2[/color][/b]) qui peut ne pas être utilisée si vous ne souhaitez pas sauvegarder automatiquement la BDD :[/b][/u] [color=#800000][b]( [u] > Mise à jour v4.0 < [/u] )[/b][/color]
|
||||
|
||||
[color=#800000][b]( [u] > Mise à jour v4.0 < [/u] )[/b]
|
||||
Je change la méthode de sauvegarde pour une nouvelle image qui permet davantage de choses, dont la sauvegarde des dossiers attachements, et sends en plus de la base de données.
|
||||
[img]https://i.imgur.com/2T2U5QL.png[/img]
|
||||
Il est possible de faire un backup local (méthode utilisée ici) mais il est également possible de faire une sauvegarde dans un cloud parmis une liste assez grande (voir plus bas).
|
||||
Le fichier 7z obtenu est protégé par un mot de passe, celui présent dans le docker-compose dans la variable ZIP_PASSWORD.
|
||||
La méthode de compression peut être changée pour zip, moins compressé, mais moins demandeur de ressources...
|
||||
[/color]
|
||||
|
||||
Comme précédemment, les indications sont en commentaires)
|
||||
[code] vaultwarden_backup_ttionya: # Voir : https://github.com/ttionya/vaultwarden-backup
|
||||
image: ttionya/vaultwarden-backup:latest
|
||||
container_name: vaultwarden_backup_ttionya
|
||||
networks:
|
||||
- vaultwarden_network
|
||||
|
||||
restart: always
|
||||
|
||||
depends_on:
|
||||
vaultwarden:
|
||||
condition: service_healthy
|
||||
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
|
||||
volumes:
|
||||
- /volume1/docker/vaultwarden/vaultwarden-data:/data
|
||||
# Chemin d'accès pour stocker le backup et la configuration rclone, voir https://github.com/ttionya/vaultwarden-backup
|
||||
- /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/config:/config
|
||||
- /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/rclone_backup:/rclone_backup
|
||||
|
||||
environment:
|
||||
- DATA_DIR=/data # Dossier de données de Vaultwarden monté avec les volumes
|
||||
- RCLONE_REMOTE_NAME=Backup_Syno # Nom de la config rclone utilisée (voir note plus bas)
|
||||
- RCLONE_REMOTE_DIR=/rclone_backup/ # Dossier qui doit monté avec les volumes
|
||||
|
||||
# Utiliser soit SCHEDULE soit INTERVAL (ce dernier en sec)
|
||||
# Pour SCHEDULE : https://crontab.guru/#0_22_*_*_*
|
||||
# Dans la ligne suivante, on programme l'exécution tous les jours à 22h
|
||||
- CRON=0 22 * * *
|
||||
- ZIP_ENABLE=TRUE
|
||||
- ZIP_PASSWORD=WHEREISMYPASSWORD?
|
||||
- ZIP_TYPE=7z
|
||||
- BACKUP_FILE_DATE_SUFFIX=--%Hh%Mm%Ss
|
||||
- BACKUP_KEEP_DAYS=7
|
||||
# - MAIL_SMTP_ENABLE=FALSE
|
||||
# - MAIL_SMTP_VARIABLES=''
|
||||
# - MAIL_TO=''
|
||||
# - MAIL_WHEN_SUCCESS='TRUE'
|
||||
# - MAIL_WHEN_FAILURE='TRUE'
|
||||
- TIMEZONE=Europe/Paris
|
||||
|
||||
#############################################
|
||||
# Note à propos de la configuration de rclone
|
||||
#############################################
|
||||
# Si vous voulez faire une sauvegarde locale, il faut juste placer le fichier rclone.conf dans le dossier ../config/rclone/
|
||||
# Dans ce fichier vous trouverez ceci :
|
||||
# [Backup_Syno]
|
||||
# type = local
|
||||
#
|
||||
# Il faudra remplacer Backup_Syno par un autre nom au besoin.
|
||||
# Ce fichier est donc prévu pour une sauvegarde locale.
|
||||
# Pour configurer d'autres types de sauvegarde, il faut lancer la configuration de rclone avec cette commande :
|
||||
# docker run --rm -it -v /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/config:/config ttionya/vaultwarden-backup:latest rclone config
|
||||
[/code]
|
||||
|
||||
|
||||
[u][b]Et enfin une dernière partie ([b][color=#4040FF]partie 3[/color][/b]) qui est obligatoire, celle qui concerne le réseau :[/b][/u]
|
||||
[code]networks: # On indique ici de quel réseau on parlait précédement
|
||||
vaultwarden_network:
|
||||
external: # C'est un réseau créé en dehors du docker-compose.
|
||||
name: vaultwarden_network # Je précise toujours un nom, car sinon ça va prendre un nom à rallonge avec
|
||||
# le nom du conteneur et du réseau voulu...
|
||||
[/code]
|
||||
|
||||
Il est à préciser que ces trois parties sont à fusionner en un seul et même fichier. Je les ai séparer pour les explications.
|
||||
Voir le fichier docker-compose.yml joint précédement.
|
||||
|
||||
[color=#BF40BF][b][size=150]3.3- Configuration de rclone pour le backup[/size][/b][/color] [color=#800000][b]( [u] > Mise à jour v4.0 < [/u] )[/b][/color]
|
||||
Pour que la sauvegarde se fasse sans erreur, il faut configurer un fichier rclone.conf qui devra se trouver dans /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/config/rclone/
|
||||
|
||||
Deux possiblités en fonction de ce que vous voudrez faire.
|
||||
[list][*] La première si vous faites comme moi, une sauvegarde locale (dans un dossier du NAS, monté dans les volumes, voir paragraphe précédent).
|
||||
Pour cette méthode, il suffit de créer un fichier rclone.conf dans /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/config/rclone/ (ou de copier le fichier joint) contenant :
|
||||
[code][Backup_Syno]
|
||||
type = local
|
||||
[/code]
|
||||
Vous remarquerez que Backup_Syno est le nom donné dans le docker compore à la variable RCLONE_REMOTE_NAME.
|
||||
Il faudra donc bien configurer la variable RCLONE_REMOTE_DIR avec le chemin d'accès à l'intérieur du conteneur.
|
||||
|
||||
Je tiens à préciser que ce mode de sauvegarde doit être complété par une tâche de backup planifiée (Hyperbackup) du dossier docker contenant le dossier Vaultwarden dans un cloud ou ailleurs.
|
||||
|
||||
[*] La seconde si vous voulez ajouter des options, ou bien faire une sauvegarde dans un cloud.
|
||||
Pour cela, il faut lancer une commande en ligne de commande SSH (donc se connecter en SSH au NAS) :
|
||||
[code]docker run --rm -it \
|
||||
-v /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/config:/config \
|
||||
ttionya/vaultwarden-backup:latest \
|
||||
rclone config
|
||||
[/code]
|
||||
|
||||
[b]NOTE : Attention, pour ceux qui utilise Portainer, il se pourrait que cette commande, lancée avant la création du conteneur, fasse que la stack ne soit pas gérable par Portainer... Créer d'abord le conteneur, puis stopper le, avant de lancer cette commande.[/b]
|
||||
|
||||
Cette commande ne crée pas le conteneur, elle va juste lancer le processus de configuration de rclone :
|
||||
[url=https://i.imgur.com/6QD37JW.png][img]https://i.imgur.com/6QD37JW.png[/img][/url]
|
||||
|
||||
Vous pourrez éditer la configuration précédemment enregistrée (dans mon exemple, celle utilisée pour le backup local), en créer une nouvelle, etc...
|
||||
Pour la création, il faut donc taper n (new remote).
|
||||
Une fois donné un nom, vous aurez le choix entre toutes ces possibilités de cloud (sauf n°22 qui est la sauvegarde locale) :
|
||||
[url=https://i.imgur.com/xSWPKVz.png][img]https://i.imgur.com/xSWPKVz.png[/img][/url] [url=https://i.imgur.com/kxO3LcS.png][img]https://i.imgur.com/kxO3LcS.png[/img][/url]
|
||||
Je n'ai pas poursuivi une de ces méthodes de cloud, à vous d'essayer ;) (si vous le faites, n'hésiter pas à revenir faire un petit retour ;) ).
|
||||
|
||||
À l'issue de l'exécution de cette configuration, vous aurez automatiquement le fichier rclone.conf écrit dans le dossier .../config/rclone/ (ou bien celui déjà existant sera modifié). [/list]
|
||||
|
||||
|
||||
|
||||
[color=#BF40BF][b][size=150]3.4- Création des dossiers et du réseau[/size][/b][/color]
|
||||
|
||||
La partie explications des options à placer dans le fichier [i]docker-compose.yml[/i] étant faite, passons à la [b]création des dossiers sur le NAS[/b].
|
||||
Vous pouvez soit passer par DSM, soit par la ligne de commande.
|
||||
Si vous optez pour la CLI, voilà les commandes à taper :
|
||||
[code]sudo -i
|
||||
cd /volume1/docker
|
||||
mkdir -p vaultwarden vaultwarden/vaultwarden-data vaultwarden/vaultwarden-backup_ttionya/config/rclone vaultwarden/vaultwarden-backup_ttionya/rclone_backup[/code]
|
||||
Une fois ces dossiers créés, copier votre [i]docker-compose.yml[/i] dans le dossier [b]/volume1/docker/vaultwarden[/b].
|
||||
|
||||
Il faut maintenant créer le réseau. Plusieurs possibilités existent.
|
||||
Soit vous passez par DSM (non expliquée ici), soit vous passez par Portainer, soit enfin via la CLI.
|
||||
[list][*] [b][color=#008040] Utilisation de Portainer :[/color][/b]
|
||||
Dans Portainer, il faut aller dans la section [b]Networks[/b], et ensuite cliquer sur le bouton [b]Add Network[/b] :
|
||||
[url=https://i.imgur.com/GleZg5t.png][img]https://i.imgur.com/GleZg5t.png[/img][/url]
|
||||
Ensuite, il suffit juste de rentrer le nom du réseau à créer (ici : ) et de bien choisir Bridge comme Driver :
|
||||
[url=https://i.imgur.com/U30Nab4.png][img]https://i.imgur.com/U30Nab4.png[/img][/url]
|
||||
Il n'y a pas besoin de toucher au reste. Portainer choisir les IP en fonction de ce qui est déjà créé chez vous.
|
||||
________________
|
||||
|
||||
[*] [b][color=#008040] Utilisation de la CLI :[/color][/b]
|
||||
Pour créer le réseau vaultwarden_network :
|
||||
[code]sudo docker network create vaultwarden_network[/code]
|
||||
Si vous voulez supprimer le réseau ainsi créé, il faut taper :
|
||||
[code]sudo docker network rm vaultwarden_network[/code]
|
||||
Au besoin, si vous voulez lister les réseeaux :
|
||||
[code]sudo docker network ls[/code]
|
||||
Note : Si vous avez plusieurs commandes à taper en mode root, il faut faire : [i]sudo -i[/i]
|
||||
Et ensuite taper vos commande sans le [i]sudo[/i] devant.
|
||||
[/list]
|
||||
|
||||
|
||||
|
||||
[color=#BF40BF][b][size=150]3.5- Création des conteneurs (2 méthodes)[/size][/b][/color]
|
||||
Maintenant tout est prêt pour qu'on se lance dans la création des conteneurs.
|
||||
Deux possibilités : passer par Portainer, ou bien la CLI.
|
||||
[list]
|
||||
[*] [b][color=#008040] Par [u]Portainer[/u] :[/color][/b]
|
||||
Il faut aller dans la section "[b]Stacks[/b]", puis cliquer sur le bouton "[b]+ Add stack[/b]" :
|
||||
[url=https://i.imgur.com/CIMB1gp.png][img]https://i.imgur.com/CIMB1gp.png[/img][/url]
|
||||
Ensuite, on donne un nom à la stack que l'on va créer et on copie/colle le contenu du fichier [b][i]docker-compose.yml[/i][/b] créé précédemment :
|
||||
[url=https://i.imgur.com/68iYBEr.png][img]https://i.imgur.com/68iYBEr.png[/img][/url]
|
||||
Il est également possible d'uploader ce dit fichier en utilisant le bouton "Upload" : (je n'ai personnellement jamais utiliser cette option, mais il n'y a pas de raison pour qu'elle ne fonctionne pas)
|
||||
[url=https://i.imgur.com/W57Jw4G.png][img]https://i.imgur.com/W57Jw4G.png[/img][/url]
|
||||
|
||||
Il ne reste plus qu'à cliquer sur le bouton "Deploy the stack" tout en bas à gauche de la page :
|
||||
[url=https://i.imgur.com/ayxVdBT.png][img]https://i.imgur.com/ayxVdBT.png[/img][/url]
|
||||
|
||||
Si une erreur apparait, ce sera dans le coin supérieur droit dans un rectangle rouge, essayer d'en faire une capture avant sa disparition.
|
||||
Si non, un message en vert apparait et les conteneurs seront créés :
|
||||
[url=https://i.imgur.com/3jMl1BF.png][img]https://i.imgur.com/3jMl1BF.png[/img][/url]
|
||||
[url=https://i.imgur.com/tVvnL7U.png][img]https://i.imgur.com/tVvnL7U.png[/img][/url]
|
||||
Vous noterez dans cette stack, il est possible de l'éditer pour la modifier avec l'onglet [b]Editor[/b] :
|
||||
[url=https://i.imgur.com/wKptW0e.png][img]https://i.imgur.com/wKptW0e.png[/img][/url]
|
||||
__________
|
||||
|
||||
[*] [b][color=#008040] Par [u]la CLI[/u] :[/color][/b]
|
||||
Avec la ligne de commande, il faut être en root (voir remarque faite précédemment à ce propos...).
|
||||
Il faut aussi être dans le dossier contenant le fichier [b][i]docker-compose.yml[/i][/b] (attention au nom, il doit être exactement [b][i]docker-compose.yml[/i][/b]), sinon il faut spécifier avec un argument supplémentaire le fichier et son chemin. Je choisi la facilité : on se place dans le bon dossier :
|
||||
[code]cd /volume1/docker/Vaultwarden
|
||||
sudo docker-compose up -d[/code]
|
||||
La création des deux conteneurs se fait et ils démarrent.
|
||||
[/list]
|
||||
|
||||
|
||||
|
||||
[color=#BF40BF][b][size=200]4- 1er lancement et sécurisation 2FA[/size][/b][/color]
|
||||
Une fois les étapes précédentes accomplies, il faut accéder au serveur avec l'url que vous avez indiqué dans la configuration.
|
||||
Si vous essayer d'accéder via l'IP LAN en http ça ne fonctionnera pas, car le HTTPS est activé, vous aurez l'erreur suivante :
|
||||
[url=https://i.imgur.com/fgfVIHs.png][img]https://i.imgur.com/fgfVIHs.png[/img][/url]
|
||||
Et si vous essayer toujours avec l'IP mais en HTTPS, vous aurez cette erreur :
|
||||
[url=https://i.imgur.com/NpwOycm.png][img]https://i.imgur.com/NpwOycml.png[/img][/url]
|
||||
|
||||
[color=#13A8BD][b]( [u] > Mise à jour - v3.1 < [/u] )[/b]
|
||||
Bref, il faut y accéder avec votre nom de domaine. Mais pour cela il faut paramétrer le reverse-proxy de DSM.
|
||||
[url=https://i.imgur.com/iP47nZm.png][img]https://i.imgur.com/iP47nZm.png[/img][/url]
|
||||
Une fois cette entrée créé, vous pouvez accéder en HTTPS avec votre nom de domain à Vaultwarden :[/color]
|
||||
[url=https://i.imgur.com/kbZkHCF.png][img]https://i.imgur.com/kbZkHCF.png[/img][/url]
|
||||
|
||||
[color=#800000][b]( [u] > Mise à jour - v3.0 < [/u] )[/b]
|
||||
Vous devriez voir ici "© 2021, Bitwarden Inc. (Powered by Vaultwarden)", ceci marque le changement de nom de l'image, voir §1)
|
||||
[/color]
|
||||
|
||||
Il faut ensuite créer votre compte et vous pourrez alors créer vos mots de passe, importer depuis un autre logiciel de mot de passe...
|
||||
|
||||
Voilà voilà.
|
||||
Reste plus qu'à sécuriser le compte avec le 2FA. Pour cela, il faut aller dans le compte :
|
||||
[url=https://i.imgur.com/f9Kfhru.png][img]https://i.imgur.com/f9Kfhru.png[/img][/url]
|
||||
[url=https://i.imgur.com/IlJMcNs.png][img]https://i.imgur.com/IlJMcNsl.png[/img][/url]
|
||||
Puis il faut choisir votre méthode. J'ai choisi de passer par une application d'authentification comme MS Authenticator, ou Authy, ou même une autre application de mot de passe comme EnPass que j'utilise aussi.
|
||||
Cliquer sur le bouton Gérer de la méthode choisie : [url=https://i.imgur.com/SX17nHB.png][img]https://i.imgur.com/SX17nHB.png[/img][/url]
|
||||
Entre votre mot de passe maitre (celui du compte BW) :
|
||||
[url=https://i.imgur.com/wiwWUcd.png][img]https://i.imgur.com/wiwWUcdl.png[/img][/url]
|
||||
À l'aide de l'application d'authentification, après y avoir entrer les infos (QR-Code ou Code alphanumérique), entrer le code à usage unique générer pour valider le 2FA :
|
||||
[url=https://i.imgur.com/dCv6lEB.png][img]https://i.imgur.com/dCv6lEBl.png[/img][/url]
|
||||
|
||||
Voilà, le compte est protégé :)
|
||||
|
||||
PS : si vous n'avez plus besoin de compte sur votre serveur, il est possible de désactiver la création des comptes.
|
||||
Dans la section :
|
||||
[code] environment:[/code]
|
||||
Il faut ajouter ceci :
|
||||
[code] - SIGNUPS_ALLOWED=false[/code]
|
||||
|
||||
|
||||
|
||||
|
||||
[size=200][color=#800000][b]( [u] > Mise à jour : AJOUT < [/u] )[/b][/color][/size]
|
||||
|
||||
|
||||
[color=#BF00BF][size=200][b]5- Ajout d'un script pour les notifications Websocket[/b][/size][/color]
|
||||
Alors, après pas mal de temps de recherche, j'ai finalement trouvé comment activer les notifications Websocket et j'ai aussi compris leur utilité.
|
||||
J'ai trouvé la méthode sur le forum officiel de Vaultwarden, où ce lien a été posté : https://gist.github.com/nstanke/3949ae1c4706854d8f166d1fb3dadc81
|
||||
J'ai pris ce script, et je l'ai amélioré selon mes goûts de sureté, et d'explications (vous verrez plus bas de quoi je parle).
|
||||
|
||||
[color=#BF40BF][b][size=150]5.1- Explications : Pourquoi ? Comment ?[/size][/b][/color]
|
||||
|
||||
Ces notifications servent à mettre à jour automatiquement les extensions navigateurs et les clients non mobiles, donc les applications windows, macos, etc, mais pas android et iOS. Pour ces derniers OS, ce n'est juste pas possible avec Vaultwarden, car il faudrait passer par les serveurs de Bitwarden pour les notifications push. Et Vaultwarden ne peut pas le faire.
|
||||
|
||||
Pour activer ces notifications Websocket, il faut faire plusieurs choses. Seul ce qui suit est faisable directement depuis DSM, dans le reverse-proxy :
|
||||
[url=https://i.imgur.com/LP6lRid.png][img]https://i.imgur.com/LP6lRid.png[/img][/url]
|
||||
Lors de la création de la règle pour Vaultwarden, il faut ajouter les entêtes personnalisés suivants : (pensez à utiliser le bouton pour créer automatiquement les deux premières lignes)
|
||||
[url=https://i.imgur.com/PenfXww.png][img]https://i.imgur.com/PenfXww.png[/img][/url] [url=https://i.imgur.com/B3nlyXP.png][img]https://i.imgur.com/B3nlyXP.png[/img][/url]
|
||||
|
||||
Pour le reste, malheureusement il n'est pas possible de le faire depuis DSM... car bien le moteur du reverse-proxy est nginx, il n'y a pas d'interface graphique pour le faire.
|
||||
Il faut faire passer /notifications/hub avec les mêmes entêtes et /notifications/hub/negotiate au conteneur. Et ça, pas moyen de le faire depuis DSM.
|
||||
Il faut passer par un script qui va créer un fichier [b]ws.locations[/b] contenant ces propriétés, et modifier le fichier de configuration [b]/etc/nginx/app.d/server.ReverseProxy.conf[/b] afin d'inclure le fichier créé [b]ws.locations[/b] au bon endroit, c'est-à-dire dans la section du nom de domaine pour bitwardenRS.
|
||||
C'est donc un prérequis (voir les captures précédentes).
|
||||
Le fichier qui sera créé ressemblera à ceci :
|
||||
[url=https://i.imgur.com/BFfTHvA.png][img]https://i.imgur.com/BFfTHvA.png[/img][/url]
|
||||
[color=#800040][b]Il faudra adapter le script suivant [u]pour tenir compte de votre adresse IP de l'hôte[/u] du conteneur vaultwarden.[/b][/color] C'est-à-dire remplacer 192.168.2.200 par l'IP de votre NAS.
|
||||
|
||||
Il est à noter que le fichier [b]/etc/nginx/app.d/server.ReverseProxy.conf[/b] est réinitialisé à chaque démarrage du NAS, mais aussi à chaque changement dans l'interface graphique du reverse-proxy dans DSM. Il faut donc le lancer périodiquement.
|
||||
Il faudra créer une tâche planifiée en conséquence.
|
||||
En ce qui me concerne j'ai créé une tâche déclenchée à chaque démarrage du NAS, et une programmée toutes les 6h. Vous pouvez mettre une fréquence plus grande (toutes les 1h) ou moins, c'est selon votre utilisation du NAS et des modifications dans le reverse-proxy.
|
||||
La modification du fichier ressemblera à ceci :
|
||||
[url=https://i.imgur.com/TPJOBIk.png][img]https://i.imgur.com/TPJOBIk.png[/img][/url]
|
||||
|
||||
[color=#BF40BF][b][size=150]5.2- Comment lancer le script ?[/size][/b][/color]
|
||||
|
||||
Le script (présent dans le § suivant) doit être lancé avec 3 arguments, sinon vous aurez un beau message indiquant que vous avez fait n'importe quoi... (mais sans rien casser, j'ai bien fait les choses).
|
||||
Si le script n'est pas lancé avec le bon nombre d'arguments, vous aurez ce message :
|
||||
[url=https://i.imgur.com/bRkCtSF.png][img]https://i.imgur.com/bRkCtSF.png[/img][/url]
|
||||
|
||||
Attention, s'il y a bien 3 arguments, je n'ai pas fait de vérification, à vous de savoir ce que vous faites !
|
||||
Voici quelques explications sur les arguments à placer.
|
||||
[list=][*] Le premier est votre nom de domaine pour Vaultwarden.
|
||||
[*] Le second est le port déclaré dans le reverse proxy pour accéder à l'interface web : par défaut c'est 80. Il sera probablement modifié dans votre installation (voir fichier docker-compose).
|
||||
[*] Le troisième est le port websocket qui par défaut est le 3012. Il sera probablement modifié dans votre installation (voir fichier docker-compose).[/list]
|
||||
|
||||
Exemple de commande à placer dans le planificateur de tâches :
|
||||
[code]bash /volume1/docker/_Scripts-DOCKER/vaultwarden_RS__Enable_Websocket.sh mon-ndd-a-moi.tld 8001 3012[/code]
|
||||
|
||||
Voilà voilà pour les explications.
|
||||
Il faudra le lancer une fois après avoir paramétré les tâches.
|
||||
|
||||
[color=#BF40BF][b][size=150]5.3- Enfin le script lui même ![/size][/b][/color]
|
||||
|
||||
Voir §0 pour télécharger le fichier.
|
||||
Attention, j'ai mis pas mal de commentaires dans le script, et que j'ai mis des lignes echo permettant d'avoir un retour d'exécution pour le log qu'on obtient.
|
||||
Lisez bien les commentaire ;)
|
||||
|
||||
[code]#!/bin/bash
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Script vaultwarden__Enable_Websocket.sh ##
|
||||
## ##
|
||||
## Source : https://gist.github.com/nstanke/3949ae1c4706854d8f166d1fb3dadc81 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Ce script pemet de router ce qui ne peut pas être fait avec le reverse-proxy ##
|
||||
## de DSM (Synology) pour faire fonctionner les notifications Websocket ##
|
||||
## Doc. vaultwarden : ##
|
||||
## Route the /notifications/hub endpoint to the WebSocket server, by default ##
|
||||
## at port 3012, making sure to pass the Connection and Upgrade headers. ##
|
||||
## (Note the port can be changed with WEBSOCKET_PORT variable) ##
|
||||
## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Principe de Tâche planifier à créer ##
|
||||
## ##
|
||||
## Il faut lancer régulièrement le script car toutes modifications faites dans l'interface ##
|
||||
## graphique du Reverse-Proxy de DSM va modifier le fichier de configuration. Il en va de ##
|
||||
## même lorsque le NAS redémarre. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## /!\ Il faut modifier l'adresse IP en ligne 79 et 85 par l'IP du NAS /!\ ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Paramètres de lancement du script : ##
|
||||
## bash /volume1/docker/vaultwarden/enable_ws.sh vault.example.com 5555 5556 ##
|
||||
## ##
|
||||
## -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) ##
|
||||
## -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM) ##
|
||||
## -- 5556 = Port exposé WEBSOCKET_PORT par Docker ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
LOC_DIR="/etc/nginx"
|
||||
part1=0
|
||||
part2=0
|
||||
|
||||
echo -e "\n$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh pour activer les Notifications Websockets"
|
||||
|
||||
f_affiche_parametre() {
|
||||
echo " bash /volume1/docker/_Scripts-DOCKER/vaultwarden__Enable_Websocket.sh vault.example.com 5555 5556 "
|
||||
echo " -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) "
|
||||
echo " -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM)"
|
||||
echo " -- 5556 = Port exposé WEBSOCKET_PORT par Docker"
|
||||
}
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
if [ $# -eq 0 ]; then
|
||||
# Aucun paramètre n'a été fourni. On va afficher la liste de ce qui peut être utilisé.
|
||||
echo "$(date "+%R:%S - ") Aucun paramètre fourni ! Revoir l'appel du script :"
|
||||
f_affiche_parametre
|
||||
else
|
||||
echo "$(date "+%R:%S - ") Le nombre de paramètres fournis n'est pas correct ! Revoir l'appel du script :"
|
||||
f_affiche_parametre
|
||||
fi
|
||||
echo -e "$(date "+%R:%S - ") ECHEC de lancement du script !!!!!!!!!\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$(date "+%R:%S - ") Exécution des commandes..."
|
||||
|
||||
|
||||
#############################################################################################################
|
||||
## Début de la partie de création/modification de fichiers
|
||||
##
|
||||
if [ -f $LOC_DIR/ws.locations ]; then
|
||||
rm /etc/nginx/ws.locations
|
||||
part1=1
|
||||
fi
|
||||
echo """
|
||||
location /notifications/hub {
|
||||
proxy_pass http://192.168.2.200:$3;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection \"upgrade\";
|
||||
}
|
||||
|
||||
location /notifications/hub/negotiate {
|
||||
proxy_pass http://192.168.2.200:$2;
|
||||
}
|
||||
""" >> $LOC_DIR/ws.locations
|
||||
|
||||
|
||||
if ! grep -q "ws.locations" /etc/nginx/app.d/server.ReverseProxy.conf; then
|
||||
sed -i "/$1;/ a\ include $LOC_DIR/ws.locations;" /etc/nginx/app.d/server.ReverseProxy.conf
|
||||
if nginx -t 2>/dev/null; then synoservicecfg --reload nginx; else exit 1; fi
|
||||
|
||||
part2=1 # Variable pour indiquer que cette partie a été exécutée
|
||||
fi
|
||||
##
|
||||
## Fin de la partie de création/modification de fichiers
|
||||
#############################################################################################################
|
||||
|
||||
if [ $part1 -eq 1 ]; then
|
||||
echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/ws.locations existait déjà, il a été supprimé puis recréé."
|
||||
else
|
||||
echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/ws.locations n'existait pas, il a été créé."
|
||||
fi
|
||||
if [ $part2 -eq 1 ]; then
|
||||
echo "$(date "+%R:%S - ") -- !!!!!! ---> La modification dans le fichier /etc/nginx/app.d/server.ReverseProxy.conf n'existait pas. Elle a été écrite."
|
||||
echo "$(date "+%R:%S - ") -- !!!!!! ---> Le fichier /etc/nginx/app.d/server.ReverseProxy.conf a du être réinitialisé après un reboot ou lors d'une modification du reverse-proxy dans DSM."
|
||||
else
|
||||
echo "$(date "+%R:%S - ") -- La modification du fichier /etc/nginx/app.d/server.ReverseProxy.conf a déjà été effectuée lors d'une précédente exécution. Aucune modification n'est donc nécessaire."
|
||||
fi
|
||||
|
||||
echo "$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh terminé"
|
||||
|
||||
exit[/code]
|
||||
|
||||
|
||||
|
||||
[i][size=150]Plus tard viendra la partie fail2ban.[/size][/i]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
________________
|
||||
|
||||
[size=150][color=#00BF80]À venir : intégration de fail2ban pour sécuriser un poil plus, même si avec le HTTPS et la 2FA c'est déjà bien :)
|
||||
[/color][/size]
|
@ -1,3 +0,0 @@
|
||||
[Backup_Syno]
|
||||
type = local
|
||||
|
@ -1,262 +0,0 @@
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Fichier docker-compose.yml pour Vaultwarden avec ttionya/vaultwarden-backup ##
|
||||
## Révision du fichier : v4.0 ##
|
||||
## ##
|
||||
## Voir tuto : https://www.forum-nas.fr/viewtopic.php?f=56&t=15341&p=99007#p99007 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Attention, avec ce fichier, il faut avoir créer le réseau "vaultwarden_network" avant de ##
|
||||
## créer les conteneurs. ##
|
||||
## ##
|
||||
## La mise en place de fail2ban se fera avec un docker-compose dédié. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## NOTE IMPORTANTE ##
|
||||
## ----------------- ##
|
||||
## ##
|
||||
## Lors de l'importation d'un fichier contenant beaucoup d'entrées, j'ai eu une erreur ##
|
||||
## 405 Not Allowed - Nginx ##
|
||||
## Après quelques recherches, et un certains nombre de minutes, il s'est avéré que les ##
|
||||
## expiration du délai ... (les timeout) dans le reverse proxy par défaut de 60s étaient ##
|
||||
## trop faible. ##
|
||||
## En passant les 3 valeurs à 300s (5min), ça a réglé mon problème. ##
|
||||
## (Pensez à relancer le script vaultwarden__Enable_Websocket.sh après ces modifications) ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Ajout des Notifications Websocket ##
|
||||
## ##
|
||||
## Pour qu'elles'fonctionnent, il faut configurer le reverse-proxy correctement. ##
|
||||
## Pour celui de DSM, il n'est malheureusement pas possible de configurer les ##
|
||||
## redirections /notifications/hub vers le serveur WebSocket ni celles vers le port normal ##
|
||||
## /notifications/hub/negotiate ##
|
||||
## Voir cet article pour tout ce qui n'est pas possible via l'interface de DSM : ##
|
||||
## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ##
|
||||
## ##
|
||||
## Dès lors, il faut ruser et passer par l'exécution d'un petit script qui va créer un ##
|
||||
## fchier ws.locations contenant les modifications précédentes, et qui va écrire une ##
|
||||
## ligne dans le fichier /etc/nginx/app.d/server.ReverseProxy.conf pour inclure le ##
|
||||
## fichier ws.locations au niveau de la section concernant le nom de domaine pour ##
|
||||
## vaultwarden. ##
|
||||
## Comme cela, il n'est pas nécessaire de passer par le changement de reverse-proxy, assez ##
|
||||
## complexe à mettre en oeuvre... ##
|
||||
## ##
|
||||
## Le script est : vaultwarden__Enable_Websocket.sh ##
|
||||
## ##
|
||||
## Il faudra la lancer régulièrement et à chaque redémarrage du NAS, via deux tâches ##
|
||||
## plannifiées dédiées, en donnant 3 paramètres au fichier : ##
|
||||
## - le nom de domaine de vaultwarden ##
|
||||
## - le port HTTP exposé (donc pas l'interne du conteneur) pour l'interface graphique ##
|
||||
## - le port websocket exposé (donc pas l'interne du conteneur) ##
|
||||
## Voir les commentaires de ce fichier vaultwarden__Enable_Websocket.sh pour plus ##
|
||||
## d'explications. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
---
|
||||
version: "2.4"
|
||||
|
||||
services:
|
||||
vaultwarden:
|
||||
image: vaultwarden/server:latest # https://github.com/dani-garcia/vaultwarden
|
||||
# https://github.com/dani-garcia/vaultwarden/wiki
|
||||
container_name: vaultwarden
|
||||
networks:
|
||||
- vaultwarden_network
|
||||
environment:
|
||||
# Utiliser la commande (en SSH) : id NOM_UTILISATEUR
|
||||
- PUID=1000
|
||||
- PGID=100
|
||||
- TZ=Europe/Paris
|
||||
|
||||
# Pour l'envoi d'emails
|
||||
- SMTP_HOST=XXxxXX
|
||||
- SMTP_FROM=XXxxXX
|
||||
- SMTP_FROM_NAME=BlaBla
|
||||
- SMTP_PORT=XXxxXX
|
||||
- SMTP_SSL=true
|
||||
- SMTP_USERNAME=XXxxXX
|
||||
- SMTP_PASSWORD=XXxxXX
|
||||
|
||||
- INVITATION_ORG_NAME=Vaultwarden [Votre Nom, pseudo...] # Permet de spécifier un nom d'application pour les invitations d'organisation
|
||||
|
||||
# Nécessaire pour activer le 2FA pour la connexion à notre serveur Vaultwarden
|
||||
# Il est possible de spécifier un port de connexion dans l'URL. Le https:// est obligatoire.
|
||||
# Pour cette option, il est donc OBLIGATOIRE d'avoir fait le nécessaire pour avoir du HTTPS (certificats, reverse-proxy, ...)
|
||||
- DOMAIN=XXxxXX
|
||||
|
||||
# Pour enregistrer les log avec un niveau particulier
|
||||
- LOG_FILE=/data/vaultwarden.log
|
||||
- LOG_LEVEL=warn
|
||||
- EXTENDED_LOGGING=true
|
||||
|
||||
# je n'aime pas les indices pour les mots de passe...
|
||||
- SHOW_PASSWORD_HINT=false
|
||||
|
||||
# Pour activer la console d'administation, accessible via : https://mon.domaine.tld/admin/
|
||||
# Voir détails ici : https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
|
||||
# /!\
|
||||
# /!\ N'importe qui pourra accéder à la page de connexion, alors blinder le token d'amdin ci-dessous (64 caractères pour moi) !
|
||||
# /!\ Il est de plus TRÈS important d'avoir ACTIVÉ le HTTPS avant l'activation de cette option.
|
||||
# /!\
|
||||
# Je conseille de ne l'activer qu'en cas de nécessité, et de la désactiver après.
|
||||
# Pour désactiver, il suffit de commenter la ligne ci-dessous.
|
||||
- ADMIN_TOKEN=XXxxXX
|
||||
# À noter :
|
||||
# La première fois que vous enregistrez un paramètre dans la page d'administration, 'config.json' sera généré
|
||||
# dans votre 'DATA_FOLDER'. Les valeurs de ce fichier auront priorité sur les valeurs 'environnement'.
|
||||
|
||||
- SIGNUPS_ALLOWED=false # Fait en sorte que les inscriptions soient bloquées, seul l'admin pourra inviter
|
||||
# des utilisateurs avec un envoi d'email depuis la console d'administation
|
||||
|
||||
- WEBSOCKET_ENABLED=true # Active les WebSocket notifications (Nécessite la configuration du reverse-proxy)
|
||||
# Durant le nombre importants d'essais, j'en suis venu à laisser le port par défaut
|
||||
# pour le WEBSOCKET_PORT. Il est possible que ça fonctionne avec un port différent.
|
||||
# Il faudra alors décommenter la ligne suivante, et changer le port exposé plus bas.
|
||||
#- WEBSOCKET_PORT=3012 # Par défaut = 3012
|
||||
|
||||
# Pour activer la récupération des icones des IP LAN, il faut mettre sur false la variable ICON_BLACKLIST_NON_GLOBAL_IPS
|
||||
- ICON_BLACKLIST_NON_GLOBAL_IPS=false # Par défaut = true
|
||||
|
||||
# On défini ici quelques chemins de dossiers qu'il faudra créer (pas sur que le conteneur les crées lui-même...)
|
||||
- ICON_CACHE_FOLDER=data/icon_cache
|
||||
- ATTACHMENTS_FOLDER=data/attachments
|
||||
- SENDS_FOLDER=data/sends
|
||||
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
|
||||
volumes:
|
||||
- "/volume1/docker/vaultwarden/vaultwarden-data/:/data/"
|
||||
ports:
|
||||
- XXxxXX:3012 # Choisir un port libre pour le websocket
|
||||
- XXxxXX:80 # Choisir un port libre pour l'interface WEB
|
||||
restart: unless-stopped
|
||||
|
||||
vaultwarden_backup_ttionya: # Voir : https://github.com/ttionya/vaultwarden-backup
|
||||
image: ttionya/vaultwarden-backup:latest
|
||||
container_name: vaultwarden_backup_ttionya
|
||||
networks:
|
||||
- vaultwarden_network
|
||||
|
||||
restart: always
|
||||
|
||||
depends_on:
|
||||
vaultwarden:
|
||||
condition: service_healthy
|
||||
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
|
||||
volumes:
|
||||
- /volume1/docker/vaultwarden/vaultwarden-data:/data
|
||||
# Chemin d'accès pour stocker le backup et la configuration rclone, voir https://github.com/ttionya/vaultwarden-backup
|
||||
- /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/config:/config
|
||||
- /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/rclone_backup:/rclone_backup
|
||||
|
||||
environment:
|
||||
- DATA_DIR=/data # Dossier de données de Vaultwarden monté avec les volumes
|
||||
- RCLONE_REMOTE_NAME=Backup_Syno # Nom de la config rclone utilisée (voir note plus bas)
|
||||
- RCLONE_REMOTE_DIR=/rclone_backup/ # Dossier qui doit monté avec les volumes
|
||||
|
||||
# Utiliser soit SCHEDULE soit INTERVAL (ce dernier en sec)
|
||||
# Pour SCHEDULE : https://crontab.guru/#0_22_*_*_*
|
||||
# Dans la ligne suivante, on programme l'exécution tous les jours à 22h
|
||||
- CRON=0 22 * * *
|
||||
- ZIP_ENABLE=TRUE
|
||||
- ZIP_PASSWORD=WHEREISMYPASSWORD?
|
||||
- ZIP_TYPE=7z
|
||||
- BACKUP_FILE_DATE_SUFFIX=--%Hh%Mm%Ss
|
||||
- BACKUP_KEEP_DAYS=7
|
||||
# - MAIL_SMTP_ENABLE=FALSE
|
||||
# - MAIL_SMTP_VARIABLES=''
|
||||
# - MAIL_TO=''
|
||||
# - MAIL_WHEN_SUCCESS='TRUE'
|
||||
# - MAIL_WHEN_FAILURE='TRUE'
|
||||
- TIMEZONE=Europe/Paris
|
||||
|
||||
#############################################
|
||||
# Note à propos de la configuration de rclone
|
||||
#############################################
|
||||
# Si vous voulez faire une sauvegarde locale, il faut juste placer le fichier rclone.conf dans le dossier ../config/rclone/
|
||||
# Dans ce fichier vous trouverez ceci :
|
||||
# [Backup_Syno]
|
||||
# type = local
|
||||
#
|
||||
# Il faudra remplacer Backup_Syno par un autre nom au besoin.
|
||||
# Ce fichier est donc prévu pour une sauvegarde locale.
|
||||
# Pour configurer d'autres types de sauvegarde, il faut lancer la configuration de rclone avec cette commande :
|
||||
# docker run --rm -it -v /volume1/docker/vaultwarden/vaultwarden-backup_ttionya/config:/config ttionya/vaultwarden-backup:latest rclone config
|
||||
|
||||
|
||||
###############################################################################################
|
||||
# Ancienne version de la partie sauvegarde
|
||||
###############################################################################################
|
||||
# Sauvegarde automatique de la base de données, au-cas-où !
|
||||
# vaultwarden_backup: # Voir : https://gitlab.com/1O/bitwarden_rs-backup
|
||||
# image: bruceforce/bw_backup:latest
|
||||
# container_name: vaultwarden_backup
|
||||
# networks:
|
||||
# - vaultwarden_network
|
||||
# restart: always
|
||||
# depends_on:
|
||||
# vaultwarden:
|
||||
# condition: service_healthy
|
||||
# labels:
|
||||
# - "com.centurylinklabs.watchtower.enable=true"
|
||||
# volumes:
|
||||
# - /volume1/docker/vaultwarden/vaultwarden-data/:/data/
|
||||
# # Chemin d'accès pour stocker le backup, voir https://gitlab.com/1O/bitwarden_rs-backup#wrong-permissions
|
||||
# - /volume1/docker/vaultwarden/vaultwarden-backup:/backup_folder/
|
||||
|
||||
# environment:
|
||||
# # Path to the vaultwarden sqlite3 database inside the container
|
||||
# - DB_FILE=/data/db.sqlite3
|
||||
|
||||
# # Path to the desired backup location inside the container
|
||||
# # - BACKUP_FILE=/data/db_backup/backup.sqlite3
|
||||
# - BACKUP_FILE=/backup_folder/backup.sqlite3
|
||||
|
||||
# # Sets the permissions of the backup file
|
||||
# # The permissions should at least be 700 since the backup folder itself gets the same permissions
|
||||
# # and with 600 it would not be accessible.
|
||||
# - BACKUP_FILE_PERMISSIONS=700
|
||||
|
||||
# # Cronjob format "Minute Hour Day_of_month Month_of_year Day_of_week Year"
|
||||
# # https://crontab.guru/#0_9_*_*_*
|
||||
# # minutes | heures | jour du mois | mois | jour de la semaine
|
||||
# - CRON_TIME=0 18 * * *
|
||||
|
||||
# # Set to true to append timestamp to the BACKUP_FILE
|
||||
# - TIMESTAMP=true
|
||||
|
||||
# # User ID to run the cron job with
|
||||
# - UID=1038 # J'ai créé un utilisateur dédié à vaultwarden, utiliser la commande 'id nom_user'
|
||||
|
||||
# # Group ID to run the cron job with
|
||||
# - GID=100
|
||||
|
||||
# # Path to the logfile inside the container
|
||||
# #- LOGFILE
|
||||
|
||||
# # Path to the cron file inside the container
|
||||
# #- CRONFILE
|
||||
|
||||
# # Delete old backups after X many days
|
||||
# - DELETE_AFTER=14
|
||||
|
||||
# # If you need timestamps in your local timezone you should mount /etc/timezone:/etc/timezone:ro and
|
||||
# # /etc/localtime:/etc/localtime:ro like it's done in the docker-compose.yml.
|
||||
# # An other possible solution is to set the environment variable accordingly (like TZ=Europe/Berlin)
|
||||
# # (see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for more information).
|
||||
# - TZ=Europe/Paris
|
||||
###############################################################################################
|
||||
|
||||
networks:
|
||||
vaultwarden_network:
|
||||
external:
|
||||
name: vaultwarden_network
|
||||
|
@ -1,114 +0,0 @@
|
||||
#!/bin/bash
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Script vaultwarden__Enable_Websocket-DSM_6.x.sh ##
|
||||
## ##
|
||||
## Source : https://gist.github.com/nstanke/3949ae1c4706854d8f166d1fb3dadc81 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Ce script pemet de router ce qui ne peut pas être fait avec le reverse-proxy ##
|
||||
## de DSM (Synology) pour faire fonctionner les notifications Websocket ##
|
||||
## Doc. vaultwarden : ##
|
||||
## Route the /notifications/hub endpoint to the WebSocket server, by default ##
|
||||
## at port 3012, making sure to pass the Connection and Upgrade headers. ##
|
||||
## (Note the port can be changed with WEBSOCKET_PORT variable) ##
|
||||
## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Principe de Tâche planifier à créer ##
|
||||
## ##
|
||||
## Il faut lancer régulièrement le script car toutes modifications faites dans l'interface ##
|
||||
## graphique du Reverse-Proxy de DSM va modifier le fichier de configuration. Il en va de ##
|
||||
## même lorsque le NAS redémarre. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## /!\ Il faut modifier l'adresse IP en ligne 79 et 85 par l'IP du NAS /!\ ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Paramètres de lancement du script : ##
|
||||
## bash /volume1/docker/bitwarden/enable_ws.sh vault.example.com 5555 5556 ##
|
||||
## ##
|
||||
## -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) ##
|
||||
## -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM) ##
|
||||
## -- 5556 = Port exposé WEBSOCKET_PORT par Docker ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
LOC_DIR="/etc/nginx"
|
||||
part1=0
|
||||
part2=0
|
||||
|
||||
echo -e "\n$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh pour activer les Notifications Websockets"
|
||||
|
||||
f_affiche_parametre() {
|
||||
echo " bash /volume1/docker/_Scripts-DOCKER/vaultwarden__Enable_Websocket.sh vault.example.com 5555 5556 "
|
||||
echo " -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) "
|
||||
echo " -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM)"
|
||||
echo " -- 5556 = Port exposé WEBSOCKET_PORT par Docker"
|
||||
}
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
if [ $# -eq 0 ]; then
|
||||
# Aucun paramètre n'a été fourni. On va afficher la liste de ce qui peut être utilisé.
|
||||
echo "$(date "+%R:%S - ") Aucun paramètre fourni ! Revoir l'appel du script :"
|
||||
f_affiche_parametre
|
||||
else
|
||||
echo "$(date "+%R:%S - ") Le nombre de paramètres fournis n'est pas correct ! Revoir l'appel du script :"
|
||||
f_affiche_parametre
|
||||
fi
|
||||
echo -e "$(date "+%R:%S - ") ECHEC de lancement du script !!!!!!!!!\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$(date "+%R:%S - ") Exécution des commandes..."
|
||||
|
||||
|
||||
#############################################################################################################
|
||||
## Début de la partie de création/modification de fichiers
|
||||
##
|
||||
if [ -f $LOC_DIR/ws.locations ]; then
|
||||
rm /etc/nginx/ws.locations
|
||||
part1=1
|
||||
fi
|
||||
echo """
|
||||
location /notifications/hub {
|
||||
proxy_pass http://192.168.2.200:$3;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection \"upgrade\";
|
||||
}
|
||||
|
||||
location /notifications/hub/negotiate {
|
||||
proxy_pass http://192.168.2.200:$2;
|
||||
}
|
||||
""" >> $LOC_DIR/ws.locations
|
||||
|
||||
|
||||
if ! grep -q "ws.locations" /etc/nginx/app.d/server.ReverseProxy.conf; then
|
||||
sed -i "/$1;/ a\ include $LOC_DIR/ws.locations;" /etc/nginx/app.d/server.ReverseProxy.conf
|
||||
if nginx -t 2>/dev/null; then synoservicecfg --reload nginx; else exit 1; fi
|
||||
|
||||
part2=1 # Variable pour indiquer que cette partie a été exécutée
|
||||
fi
|
||||
##
|
||||
## Fin de la partie de création/modification de fichiers
|
||||
#############################################################################################################
|
||||
|
||||
if [ $part1 -eq 1 ]; then
|
||||
echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/ws.locations existait déjà, il a été supprimé puis recréé."
|
||||
else
|
||||
echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/ws.locations n'existait pas, il a été créé."
|
||||
fi
|
||||
if [ $part2 -eq 1 ]; then
|
||||
echo "$(date "+%R:%S - ") -- !!!!!! ---> La modification dans le fichier /etc/nginx/app.d/server.ReverseProxy.conf n'existait pas. Elle a été écrite."
|
||||
echo "$(date "+%R:%S - ") -- !!!!!! ---> Le fichier /etc/nginx/app.d/server.ReverseProxy.conf a du être réinitialisé après un reboot ou lors d'une modification du reverse-proxy dans DSM."
|
||||
else
|
||||
echo "$(date "+%R:%S - ") -- La modification du fichier /etc/nginx/app.d/server.ReverseProxy.conf a déjà été effectuée lors d'une précédente exécution. Aucune modification n'est donc nécessaire."
|
||||
fi
|
||||
|
||||
echo "$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh terminé"
|
||||
|
||||
exit
|
@ -1,129 +0,0 @@
|
||||
#!/bin/bash
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Script vaultwarden__Enable_Websocket-DSM_7.sh ##
|
||||
## ##
|
||||
## Source : https://gist.github.com/nstanke/3949ae1c4706854d8f166d1fb3dadc81 ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Ce script pemet de router ce qui ne peut pas être fait avec le reverse-proxy ##
|
||||
## de DSM (Synology) pour faire fonctionner les notifications Websocket ##
|
||||
## Doc. vaultwarden : ##
|
||||
## Route the /notifications/hub endpoint to the WebSocket server, by default ##
|
||||
## at port 3012, making sure to pass the Connection and Upgrade headers. ##
|
||||
## (Note the port can be changed with WEBSOCKET_PORT variable) ##
|
||||
## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Principe de Tâche planifier à créer ##
|
||||
## ##
|
||||
## Il faut lancer régulièrement le script car toutes modifications faites dans l'interface ##
|
||||
## graphique du Reverse-Proxy de DSM va modifier le fichier de configuration. Il en va de ##
|
||||
## même lorsque le NAS redémarre. ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## /!\ Il faut modifier l'adresse IP en ligne 47 par l'IP du NAS /!\ ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
## ##
|
||||
## Paramètres de lancement du script : ##
|
||||
## bash /volume1/docker/bitwarden/enable_ws.sh vault.example.com 5555 5556 ##
|
||||
## ##
|
||||
## -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) ##
|
||||
## -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM) ##
|
||||
## -- 5556 = Port exposé WEBSOCKET_PORT par Docker ##
|
||||
## ##
|
||||
##==============================================================================================
|
||||
|
||||
LOC_DIR="/etc/nginx"
|
||||
part1=0
|
||||
part2=0
|
||||
MY_DOMAIN=$1
|
||||
PORT_ACCES=$2
|
||||
PORT_CONT=$3
|
||||
IP_NAS="192.168.2.200"
|
||||
|
||||
echo -e "\n$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh pour activer les Notifications Websockets"
|
||||
|
||||
f_affiche_parametre() {
|
||||
echo " bash /volume1/docker/_Scripts-DOCKER/vaultwarden__Enable_Websocket.sh vault.example.com 5555 5556 "
|
||||
echo " -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) "
|
||||
echo " -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM)"
|
||||
echo " -- 5556 = Port exposé WEBSOCKET_PORT par Docker"
|
||||
}
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
if [ $# -eq 0 ]; then
|
||||
# Aucun paramètre n'a été fourni. On va afficher la liste de ce qui peut être utilisé.
|
||||
echo "$(date "+%R:%S - ") Aucun paramètre fourni ! Revoir l'appel du script :"
|
||||
f_affiche_parametre
|
||||
else
|
||||
echo "$(date "+%R:%S - ") Le nombre de paramètres fournis n'est pas correct ! Revoir l'appel du script :"
|
||||
f_affiche_parametre
|
||||
fi
|
||||
echo -e "$(date "+%R:%S - ") ECHEC de lancement du script !!!!!!!!!\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$(date "+%R:%S - ") Exécution des commandes..."
|
||||
|
||||
|
||||
#############################################################################################################
|
||||
## Début de la partie de création/modification de fichiers
|
||||
##
|
||||
if [ -f $LOC_DIR/websocket.locations.vaultwarden ]; then
|
||||
rm $LOC_DIR/websocket.locations.vaultwarden
|
||||
part1=1
|
||||
fi
|
||||
echo """
|
||||
location /notifications/hub {
|
||||
proxy_pass http://$IP_NAS:$PORT_CONT;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection \"upgrade\";
|
||||
}
|
||||
|
||||
location /notifications/hub/negotiate {
|
||||
proxy_pass http://$IP_NAS:$PORT_ACCES;
|
||||
}
|
||||
""" >>$LOC_DIR/websocket.locations.vaultwarden
|
||||
|
||||
# Note : avec DSM7, le chemin d'accès du fichier server.ReverseProxy.conf a changé
|
||||
# DSM6.2 = /etc/nginx/app.d/server.ReverseProxy.conf
|
||||
# DSM7 = /etc/nginx/sites-enabled/server.ReverseProxy.conf
|
||||
if ! grep -q "websocket.locations.vaultwarden" /etc/nginx/sites-enabled/server.ReverseProxy.conf; then
|
||||
|
||||
# Commandes fonctionnelles avec DSM6.2.x, mais plus avec DSM 7.0 (RC)
|
||||
#sed -i "/$1;/ a\ include $LOC_DIR/websocket.locations.vaultwarden;" /etc/nginx/app.d/server.ReverseProxy.conf
|
||||
#if nginx -t 2>/dev/null; then synoservicecfg --reload nginx; else exit 1; fi
|
||||
|
||||
# Commande fonctionnelles avec DSM 7 (RC)
|
||||
sed -r "s#^([[:blank:]]*server_name[[:blank:]]*${MY_DOMAIN}[[:blank:]]*;[[:blank:]]*)\$#\1\n\n\tinclude ${LOC_DIR}/websocket.locations.vaultwarden;#" /etc/nginx/sites-enabled/server.ReverseProxy.conf > /etc/nginx/sites-enabled/server.ReverseProxy.conf.new
|
||||
mv /etc/nginx/sites-enabled/server.ReverseProxy.conf.new /etc/nginx/sites-enabled/server.ReverseProxy.conf
|
||||
|
||||
if nginx -t 2>/dev/null; then synosystemctl reload nginx; else exit 1; fi
|
||||
|
||||
part2=1 # Variable pour indiquer que cette partie a été exécutée
|
||||
|
||||
fi
|
||||
##
|
||||
## Fin de la partie de création/modification de fichiers
|
||||
#############################################################################################################
|
||||
|
||||
if [ $part1 -eq 1 ]; then
|
||||
echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/websocket.locations.vaultwarden existait déjà, il a été supprimé puis recréé."
|
||||
else
|
||||
echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/websocket.locations.vaultwarden n'existait pas, il a été créé."
|
||||
fi
|
||||
if [ $part2 -eq 1 ]; then
|
||||
echo "$(date "+%R:%S - ") -- !!!!!! ---> La modification dans le fichier /etc/nginx/sites-enabled/server.ReverseProxy.conf n'existait pas. Elle a été écrite."
|
||||
echo "$(date "+%R:%S - ") -- !!!!!! ---> Le fichier /etc/nginx/sites-enabled/server.ReverseProxy.conf a du être réinitialisé après un reboot ou lors d'une modification du reverse-proxy dans DSM."
|
||||
else
|
||||
echo "$(date "+%R:%S - ") -- La modification du fichier /etc/nginx/sites-enabled/server.ReverseProxy.conf a déjà été effectuée lors d'une précédente exécution. Aucune modification n'est donc nécessaire."
|
||||
fi
|
||||
|
||||
echo "$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh terminé"
|
||||
|
||||
exit
|
@ -1,29 +0,0 @@
|
||||
## Discord Plex FR : https://discord.gg/ERpYMqS
|
||||
## Version 2021-02-26
|
||||
version: "2.3"
|
||||
services:
|
||||
watchtower:
|
||||
container_name: watchtower
|
||||
image: containrrr/watchtower:amd64-latest
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- WATCHTOWER_SCHEDULE= 0 0 6 * * * #mise a jour des conteneurs tous les jours a 6:00
|
||||
- WATCHTOWER_LABEL_ENABLE=true
|
||||
- WATCHTOWER_CLEANUP=true
|
||||
- WATCHTOWER_REMOVE_VOLUMES=true
|
||||
- WATCHTOWER_NOTIFICATIONS_LEVEL=debug
|
||||
#Les 3 lignes dessous sont a utiliser pour être notifié par Gotify
|
||||
# - WATCHTOWER_NOTIFICATIONS=gotify
|
||||
# - WATCHTOWER_NOTIFICATION_GOTIFY_URL=https://gotify.ndd.fr
|
||||
# - WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN=
|
||||
- WATCHTOWER_ROLLING_RESTART=true
|
||||
- WATCHTOWER_LIFECYCLE_HOOKS=true
|
||||
#Les 3 lignes dessous sont a utiliser pour être notifié par SLACK/DISCORD
|
||||
# - WATCHTOWER_NOTIFICATIONS=slack #si discord laissé slack
|
||||
# - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower
|
||||
# - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=URL-DU-TOKEN/slack #si discord laissé /slack
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip
|
||||
network_mode: 'watchtower_network'
|
@ -1,33 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS*
|
||||
|
||||
*Version 2021-02-26*
|
||||
|
||||
# Activer la fonction Skip Intro
|
||||
|
||||
Disponible depuis la version 1.19.3.2793, cette fonction permet de passer les génériques d’intro des séries.
|
||||
Les intros de moins de 20 secondes sont ignorées ainsi que celles situées à plus de la moitié de l’épisode.
|
||||
Cette fonctionnalité va analyser chaque épisode de chaque série pour déterminer l’introduction, cela peut donc prendre du temps!
|
||||
Attention, le Plex Pass est obligatoire pour l’utilisateur qui regarde du contenu, ainsi que le propriétaire du serveur Plex!
|
||||
(Les utilisateurs gérés présents dans le PlexHOME ont également accès à cette fonction.)
|
||||
|
||||
**Lecteurs compatibles :**
|
||||
- Fire TV `v.8.0.1+`
|
||||
- Android mobile `v.8.0.1+`
|
||||
- Android TV `v.8.0.1+`
|
||||
- Apple TV `v.2.18+`
|
||||
- iOS `v.6.12+`
|
||||
- macOS `v.1.11+`
|
||||
- Roku `v.6.5.4+`
|
||||
- Web `v.4.34+`
|
||||
- Windows `v.1.11+`
|
||||
|
||||
**Activer l’analyse automatique :**
|
||||
• Sur Plex allez ici: `Paramètres → Bibliothèque`
|
||||
• Repérez le réglage `Generate intro video markers` et mettez-le soit en `tâche planifiée`, soit `tâche planifiée et quand un média est ajouté` (Je vous conseille la 1ère option car l’analyse se fera uniquement durant la maintenance.)
|
||||
|
||||
Si vous avez plusieurs bibliothèques telles que: Séries TV, Séries d’animation et Toutes les Séries. Vous devriez décocher l’option `enable intro detection` (`••• → Gérer la bibliothèque → Modifier → Avancé`) des bibliothèques Séries TV ainsi que Séries d’animation (car l’analyse sera effectuée sur la bibliothèque Toutes les Séries et cela évite au serveur de ré-analyser chaque fichier.)
|
||||
|
||||
**Analyse manuelle :**
|
||||
Pour analyser manuellement une bibliothèque (`••• → Gérer la bibliothèque → Analyser`), ou une série (`••• → Analyser`).
|
||||
|
||||
*Écrit par Ymerix le 04/09/2020*
|
@ -1,51 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS Version 2021-03-08*
|
||||
|
||||
### Installation de Docker, Docker-compose et Portainer sur raspbian
|
||||
|
||||
## Sommaire
|
||||
* [Pré-requis](#pré-requis)
|
||||
* [Installation de Docker](#installation-de-docker)
|
||||
* [Installation de Docker-compose](#installation-de-docker-compose)
|
||||
* [Installation de Portainer](#installation-de-portainer)
|
||||
|
||||
## Pré-requis :
|
||||
|
||||
En 1er temps, on met a jour le raspberry :
|
||||
`sudo apt update && sudo apt upgrade -y`
|
||||
|
||||
## Installation de Docker :
|
||||
|
||||
On install docker :
|
||||
`curl -sSL https://get.docker.com | sh`
|
||||
|
||||
On ajoute l'utilisateur pi au groupe docker :
|
||||
`sudo usermod -aG docker pi`
|
||||
|
||||
## Installation de Docker-compose :
|
||||
|
||||
On install les dépendances nécessaires :
|
||||
`sudo apt install libffi-dev libssl-dev python3 python3-pip`
|
||||
|
||||
On install docker-compose
|
||||
`sudo pip3 install docker-compose`
|
||||
|
||||
On redémarre le Raspberry
|
||||
`sudo reboot`
|
||||
|
||||
## Installation de Portainer :
|
||||
|
||||
On créer le volume portainer_data nécessaire au fonctionnement de Portainer
|
||||
docker volume create portainer_data
|
||||
|
||||
On créer le conteneur contenant Portainer, et on le lance :
|
||||
`docker run -d -p 8000:8000 -p 9000:9000 --restart unless-stopped --name="Portainer" -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer`
|
||||
|
||||
Maintenant nous pouvons accéder à l'interface de Portainer, via l'adresse : http://adresse_du_pi:9000/
|
||||
Exemple, si votre Pi est a l'adresse ip 192.168.1.210, l'interface de Portainer sera l'adresse : http://192.168.1.210:9000/
|
||||
|
||||
La 1ere chose a faire est de choisir un nom d'utilisateur et un mot de passe, ensuite, on choisi la méthode de connexion a docker, on choisi "Local" et on clique sur "Connect"
|
||||
|
||||
|
||||
[Source 1](https://linuxhint.com/install_docker_on_raspbian_os/) | [Source 2](https://www.zuidwijk.com/installing-docker-and-docker-compose-on-a-raspberry-pi-4/)
|
||||
|
||||
*Écrit par EVOTk le 04/09/2020*
|
@ -1,72 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS*
|
||||
*Version 2021-02-26*
|
||||
|
||||
# Association La Casa De Papel
|
||||
|
||||
Pour les détenteurs de la serie `La Casa de Papel` sur Plex, vous avez dû remarquer que l'association de la série est impossible car les episodes ne sont pas répertorié de la même manière sur TMDb, TheTVDB et Netflix, (TMDb & TheTVDB 2 saisons, Netflix 4 saisons) nous allons voir comment mettre en place les 4 saisons sur Plex comme sur Netflix avec les titres des épisodes, les cover, les fanart et la liste des acteurs !
|
||||
|
||||
Les épisodes doivent être rangés comme suit :
|
||||
- Saison 1 : 13 épisodes
|
||||
- Saison 2 : 9 épisodes
|
||||
- Saison 3 : 8 épisodes
|
||||
- Saison 4 : 8 épisodes
|
||||
|
||||
C'est d'ailleurs dans ce format là que vous allez la trouver la plupart du temps, d'où l'intérêt de ce tutoriel 😉
|
||||
|
||||
**! Attention !** Si jamais vos épisodes ne sont pas répertorié de cette manière sur Plex, déplacer votre série complètement de votre dossier série, lancer un scan sur Plex pour que celle-ci n'apparaisse plus, réorganiser là de cette manière et remettez là dans votre dossier série, scannez à nouveau pour qu'elle apparaisse dans cet ordre là !
|
||||
|
||||
Plutôt que de tout editer manuellement il existe une façon plus simple de tout corriger avec l'outil `XBMCnfoTVimporter`.
|
||||
|
||||
Il ajoute un nouvel agent à Plex lisant des fichiers nfo locaux. (Ça devrait être intégré sur Plex mais bon 🙄)
|
||||
|
||||
***Télécharger le Plug-in Webtools ici :*** [WebTools](https://github.com/ukdtom/WebTools.bundle/releases/tag/3.0.0)
|
||||
|
||||
Pour l'installer, placer le dossier WebTools.bundle dans votre dossier Plug-in Plex (vérifier bien que le nom du dossier soit webtools.bundle et pas autre chose !)
|
||||
|
||||
Redémarrez votre serveur Plex, vous devrez le voir apparaître dans vos extensions dans la page de gestion de votre serveur Plex, `Paramètres > Réglages > Extension`.
|
||||
|
||||
Maintenant rendez-vous sur la plage : http://ipduserveurPlex:33400
|
||||
|
||||
Logguer vous avec vos identifiants Plex.
|
||||
Dans le menu sur la gauche, cliquer sur `UAS`.
|
||||
Dans les catégories à droite > `Agent`
|
||||
|
||||
Enfin, installer l'agent `XBMCnfoTVImporter`.
|
||||
|
||||
Une fois l'installation terminée, redémarrer votre serveur Plex.
|
||||
|
||||
Rendez-vous maintenant sur votre page d'administration Plex > `Paramètres > Agents > Séries > XBMCnfoTVImporter`.
|
||||
|
||||
Cocher tout les agents et placez-les dans l'ordre suivant :
|
||||
- Local Media Assets (TV)
|
||||
- XBMCnfoTVImporter
|
||||
- Plexe Theme Music
|
||||
- OpenSubtitles.org
|
||||
|
||||
Cliquer sur le logo Paramètres à côté de XBMCnfoTqvImporter puis cocher `disable agents artwork support` , et `SAUVEGARDER`.
|
||||
|
||||
Ensuite, télécharger le pack de données de la série, j'ai fais un repack de plusieurs données que j'ai trouver sur le net, il contient les .nfo, les cover et les fanart, tout en français !
|
||||
|
||||
Télécharger ici : https://uptobox.com/8fajowr00h0w
|
||||
|
||||
Maintenant, il faut extraire les fichiers dans votre dossier "La Casa de papel", l'arborescence est déjà faite, attention, le nom des fichier NFO et JPG doivent correpondre au nom de l'épisode en question ! S'ils ne sont pas nommé de la même manière chez vous pensez à les renommer pour qu'ils correspondent !
|
||||
|
||||
Ensuite, allez dans Plex, La Casa de Papel > "corriger l'association" (3 petits points sur la droite de la cover de la série) > Options de recherche (en haut en orange) et maintenant sélectionnez le nouveau XBMC... dans Agent de la liste déroulante et cliquer sur Rechercher.
|
||||
|
||||
La Casa de Papel va maintenant apparaître, cliquer dessus.
|
||||
|
||||
Actualisé les métadonnées et attendez la fin du téléchargement des métadonnées.
|
||||
|
||||
Vous devez charger le fond des saisons manuellement, il correspond au fichier SeasonXX-fanart.jpg dans leur dossier saison respectif.
|
||||
|
||||
Je vous ai aussi mis les synospys des saisons que vous devrez ajouter manuellement sur Plex en cliquant sut le petit crayon sur la cover de la saison.
|
||||
|
||||
Voilà, vous avez maintenant la Casa de Papel correctement répertorié sur Plex 😊.
|
||||
|
||||
Le seul problème restant, qui ne peux malheureusement pas être règlé, est pour les utilisateurs de Sonarr, la série ne sera jamais détecté comme complète car les saisons ne sont pas rangées comme sur TheTVDB.
|
||||
|
||||
**Crédits :**
|
||||
- NFO (BenMitnicK édité par Razor_AMG)
|
||||
- Fanart (BenMitnicK)
|
||||
- Cover a (XDM)
|
||||
- Cover b (Razor_AMG)
|
@ -1,43 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS* *Version 2021-3-07*
|
||||
|
||||
###Markdown
|
||||
|
||||
**Styles :**
|
||||
- Italique : *texte* ou _texte_
|
||||
- Gras : **texte**
|
||||
- Souligné : __texte__
|
||||
- Barré : ~~texte~~
|
||||
- Italique souligné : __*texte*__
|
||||
- Gras souligné : __**texte**__
|
||||
- Gras italique : ***texte***
|
||||
- Gras italique souligné : __***texte***__
|
||||
- Gras italique souligné barré : ~~__***texte***__~~
|
||||
- Spoil : ||texte||
|
||||
*ce ne sont que des exemples, mais vous pouvez jongler entre les différents styles*
|
||||
*note : Si un style italique souligné commence avec __*, il doit finir avec *__*
|
||||
|
||||
**Blocs de code :**
|
||||
- Simple : [Image](https://support.discord.com/hc/article_attachments/360058503112/1_code_block.png)
|
||||
- Gros bloc : [Image](https://support.discord.com/hc/article_attachments/360058503132/2_multiple_line_code_blocks.png)
|
||||
- Gros bloc avec couleur de code : [Image](https://support.discord.com/hc/article_attachments/360058666851/3_css.png)
|
||||
*impossible de montrer autrement qu'avec des images pour ces 3 exemples*
|
||||
|
||||
**Citations :**
|
||||
Citation : > texte
|
||||
Bloc
|
||||
de
|
||||
citation : >>> texte
|
||||
|
||||
**Liens :**
|
||||
[Text](link)
|
||||
Voici un texte avec un lien vers [un site sur les réseaux de neurones](https://www.neural-networks.io)
|
||||
|
||||
**Titres de section :**
|
||||
# h1 Heading
|
||||
## h2 Heading
|
||||
### h3 Heading
|
||||
#### h4 Heading
|
||||
##### h5 Heading
|
||||
###### h6 Heading
|
||||
|
||||
*Écrit par Ymerix le 23/02/2021*
|
@ -1,9 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS* *Version 2021-03-07*
|
||||
|
||||
# nvidia transcoding
|
||||
|
||||
Estimation du nombre de transcode de votre carte nvidia
|
||||
|
||||
[Elpamsoft.com](https://www.elpamsoft.com/?p=Plex-Hardware-Transcoding)
|
||||
|
||||
*Écrit par Zoz le 19/11/2020*
|
@ -1,27 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS*
|
||||
*Version 2021-02-26*
|
||||
|
||||
# Passmark & Transcodage Software
|
||||
|
||||
Le Passmark est un indice de puissance brute de calcul d'un processeur. Celui-ci est exprimé en **points**.
|
||||
Plus le score est élevé, plus le processeur est "puissant".
|
||||
|
||||
Pour connaitre le score de votre processeur, rendez-vous ici : https://www.cpubenchmark.net/
|
||||
|
||||
## Recommandations de Plex :
|
||||
|
||||
Pour un seul transcodage complet d'une vidéo, les exigences de score PassMark suivantes sont une bonne indication :
|
||||
- 4K HDR (50Mbps, 10-bit HEVC) file: 17000 PassMark score*
|
||||
- 4K SDR (40Mbps, 8-bit HEVC) file: 12000 PassMark score*
|
||||
- 1080p (10Mbps, H.264) file: 2000 PassMark score
|
||||
- 720p (4Mbps, H.264) file: 1500 PassMark score
|
||||
|
||||
**en transcodage vers une version 1080p 10Mbps*
|
||||
|
||||
|
||||
## Exemple :
|
||||
Si on prend exemple sur un [Intel J4125](https://www.cpubenchmark.net/cpu.php?cpu=Intel+Celeron+J4125+%40+2.00GHz&id=3667), celui possède 3108 points.
|
||||
|
||||
En **transcodage software**, il sere donc capable de transcoder au maximum un flux 1080p. Mais bien incapable de transcoder un flux 4K !
|
||||
|
||||
**Source :** [Support Plex](https://support.plex.tv/articles/201774043-what-kind-of-cpu-do-i-need-for-my-server/)
|
@ -1,18 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS* *Version 2021-03-07*
|
||||
|
||||
# Quel serveur acheter
|
||||
|
||||
- Combien de transcodages en simultanés ?
|
||||
- Connexion locale et/ou distante ?
|
||||
- Connexion internet actuelle ?
|
||||
- Faire profiter mon entourage ?
|
||||
- Nombre d'utilisateurs ?
|
||||
- Quels disques pour les films/séries et où les mettre ?
|
||||
- Quantité de stockage ?
|
||||
- Serveur dédié à Plex ou pas ?
|
||||
- Quel budget (hors disques durs) ?
|
||||
- Solutions plutôt clés en main ou un Linux pourrait convenir ?
|
||||
|
||||
__**Et répondez-y en-dessous pour que l'on puisse vous aider.**__
|
||||
|
||||
*Écrit par Ymerix le 04/09/2020*
|
@ -1,10 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS* *Version 2021-03-07*
|
||||
|
||||
# Quiksync
|
||||
|
||||
Quicksync permet un nombre de transcodes énorme sans cartes graphique, c'est une solution a considéré si vous souhaitez un serveur capable de plus de 10 transcodes...
|
||||
|
||||
[Serverbuilds](https://forums.serverbuilds.net/t/guide-hardware-transcoding-the-jdm-way-quicksync-and-nvenc/1408/3)
|
||||
|
||||
*Écrit par Zoz le 19/11/2020*
|
||||
|
@ -1,27 +0,0 @@
|
||||
*Discord Plex FR : https://discord.gg/ERpYMqS* *Version 2021-03-08*
|
||||
|
||||
# Transcoder 4k
|
||||
|
||||
__**ON NE TRANSCODE PAS DE LA 4K !**__
|
||||
|
||||
░░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄░░░░░░░
|
||||
░░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄░░░░
|
||||
░░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█░░░
|
||||
░░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░░█░░
|
||||
░▄▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░░█░
|
||||
█░▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒░█
|
||||
█░▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█
|
||||
░█░▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█░
|
||||
░░█░░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█░░
|
||||
░░░█░░░░██░░▀█▄▄▄█▄▄█▄████░█░░░
|
||||
░░░░█░░░░▀▀▄░█░░░█░█▀██████░█░░
|
||||
░░░░░▀▄░░░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█░░
|
||||
░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░▒░░░█░
|
||||
░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░░░░█░
|
||||
░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░░░░█░░
|
||||
|
||||
__**ON NE TRANSCODE PAS DE LA 4K !**__
|
||||
|
||||
[Plus sérieusement la solution ici !](https://peertube.zoz-serv.org/videos/watch/506fbe5e-2973-43bc-9e96-a686e54b1c20)
|
||||
|
||||
*Écrit par Ymerix le 04/09/2020, Maj Zoz le 07/03/2021*
|
Loading…
Reference in New Issue
Block a user