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:
MilesTEG 2021-08-10 14:47:20 +02:00
commit 7908c218fa
84 changed files with 573 additions and 5297 deletions

20
LICENSE
View File

@ -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
View 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

View 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/)

View 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/)

View 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))

View File

@ -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

View File

@ -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`

View File

@ -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

View File

@ -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

View File

@ -1,16 +0,0 @@
# Listes dautorisation 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

View File

@ -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

View File

@ -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

View File

@ -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 ##
##==============================================================================================

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -1,4 +0,0 @@
[Init]
blocktype = DROP
[Init?family=inet6]
blocktype = DROP

View File

@ -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 =

View File

@ -1,8 +0,0 @@
# /volume1/docker/fail2ban/filter.d/vaultwarden-admin.conf
[INCLUDES]
before = common.conf
[Definition]
failregex = ^.*Invalid admin token\. IP: <ADDR>.*$
ignoreregex =

View File

@ -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 =

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 .
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");

View File

@ -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 .
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");

View File

@ -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 .
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");

View File

@ -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 .
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");

View File

@ -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 .
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");

View File

@ -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 .
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");

View File

@ -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 .
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");

View File

@ -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">

View File

@ -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

View File

@ -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
## ##
##==============================================================================================

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -1,5 +0,0 @@
RT_DHT_PORT=6881
XMLRPC_PORT=8000
RUTORRENT_PORT=8080
WEBDAV_PORT=9000
RT_INC_PORT=50000

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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'

View File

@ -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]

View File

@ -1,3 +0,0 @@
[Backup_Syno]
type = local

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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 dintro 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 lintroduction, cela peut donc prendre du temps!
Attention, le Plex Pass est obligatoire pour lutilisateur 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 lanalyse 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 lanalyse se fera uniquement durant la maintenance.)
Si vous avez plusieurs bibliothèques telles que: Séries TV, Séries danimation et Toutes les Séries. Vous devriez décocher loption `enable intro detection` (`••• → Gérer la bibliothèque → Modifier → Avancé`) des bibliothèques Séries TV ainsi que Séries danimation (car lanalyse 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*

View File

@ -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*

View File

@ -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)

View File

@ -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*

View File

@ -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*

View File

@ -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/)

View File

@ -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*

View File

@ -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*

View File

@ -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*