Compare commits
47 Commits
create-pul
...
86e10379cd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
86e10379cd | ||
|
|
c610500d15 | ||
|
|
374b3b8c4c | ||
|
|
f94b1fd18f | ||
|
|
a230b28ffd | ||
|
|
81cee949ab | ||
|
|
72d1071fa5 | ||
|
|
5fd7b5ed32 | ||
|
|
6f28b28d3d | ||
|
|
f74569d99a | ||
|
|
b3be37640e | ||
|
|
7ee0c3785e | ||
|
|
7308f78a39 | ||
|
|
3f17818ce9 | ||
|
|
0264ef9d97 | ||
|
|
822c03dac9 | ||
|
|
bda1ffedde | ||
|
|
6e7308f4e6 | ||
|
|
79ed3e5808 | ||
|
|
e4b963a267 | ||
|
|
f59c21e72e | ||
|
|
5a41d1c265 | ||
|
|
7342b37a06 | ||
|
|
55dcc50db5 | ||
|
|
a2ac40cb5f | ||
|
|
30ddded1e7 | ||
|
|
1ce8364f54 | ||
|
|
7bf0069840 | ||
|
|
8863fa34f3 | ||
|
|
558ecd07cd | ||
|
|
ca6ad47646 | ||
|
|
a8e81b7482 | ||
|
|
ce1fba1745 | ||
|
|
87ace5f42c | ||
|
|
1efa2ce23a | ||
|
|
9084975422 | ||
|
|
2c7426c284 | ||
|
|
953ce8aed4 | ||
|
|
966758bf74 | ||
|
|
739f3c4a65 | ||
|
|
40e8e2a46e | ||
|
|
d1e63f90ab | ||
|
|
818cd564e0 | ||
|
|
8c4a2f646e | ||
|
|
e9678ea72e | ||
|
|
3fa45751d8 | ||
|
|
b0c45804fe |
11
.github/stargazer_countries.csv
vendored
@@ -197,6 +197,7 @@ Fabian-Eigenherd,Germany
|
|||||||
Faithfinder,Canada
|
Faithfinder,Canada
|
||||||
FallsSteven,
|
FallsSteven,
|
||||||
Felitendo,
|
Felitendo,
|
||||||
|
Filipza,
|
||||||
Flipsoo,
|
Flipsoo,
|
||||||
FloppiTuna,United States
|
FloppiTuna,United States
|
||||||
Fluffy-Bunny-23,
|
Fluffy-Bunny-23,
|
||||||
@@ -487,6 +488,7 @@ Rapozillha,Portugal
|
|||||||
Raw2x2,
|
Raw2x2,
|
||||||
RdN-J,
|
RdN-J,
|
||||||
RealJustMe,
|
RealJustMe,
|
||||||
|
Redmno,
|
||||||
Reiqu,Germany
|
Reiqu,Germany
|
||||||
RemcoSchrijver,Netherlands
|
RemcoSchrijver,Netherlands
|
||||||
Rene2302,
|
Rene2302,
|
||||||
@@ -494,6 +496,7 @@ RescueWolf-Dreamwalker,
|
|||||||
RhaaKaye,
|
RhaaKaye,
|
||||||
RicLund,Canada
|
RicLund,Canada
|
||||||
Richyread,
|
Richyread,
|
||||||
|
RimmeVG,
|
||||||
Rimpla,
|
Rimpla,
|
||||||
Robbot,Ireland
|
Robbot,Ireland
|
||||||
RobertZwets,
|
RobertZwets,
|
||||||
@@ -581,6 +584,7 @@ Syuq,
|
|||||||
T-I-M-O-T,
|
T-I-M-O-T,
|
||||||
TCTnz,
|
TCTnz,
|
||||||
THENEXTBIGTIME,
|
THENEXTBIGTIME,
|
||||||
|
TS-1709,
|
||||||
TarrX,Germany
|
TarrX,Germany
|
||||||
Tche333,
|
Tche333,
|
||||||
Tchoupinax,
|
Tchoupinax,
|
||||||
@@ -814,6 +818,7 @@ bigsby-exe,United Kingdom
|
|||||||
bilak,Czechia
|
bilak,Czechia
|
||||||
bitDealer,
|
bitDealer,
|
||||||
bjackerman,United States
|
bjackerman,United States
|
||||||
|
bjoe10,
|
||||||
bkuri,Mexico
|
bkuri,Mexico
|
||||||
blackshoals,
|
blackshoals,
|
||||||
blairun,
|
blairun,
|
||||||
@@ -946,6 +951,7 @@ ctrlaltprocrastinate,
|
|||||||
ctyfrank,
|
ctyfrank,
|
||||||
cuza,Cuba
|
cuza,Cuba
|
||||||
cvladan,
|
cvladan,
|
||||||
|
cvroque,
|
||||||
cwmoriarty,
|
cwmoriarty,
|
||||||
cy1798,
|
cy1798,
|
||||||
cyberjohn60,
|
cyberjohn60,
|
||||||
@@ -1051,6 +1057,7 @@ dtrochow,
|
|||||||
duckduckuk,United Kingdom
|
duckduckuk,United Kingdom
|
||||||
duhaijian,
|
duhaijian,
|
||||||
dumbledorethor,
|
dumbledorethor,
|
||||||
|
dutzi88,
|
||||||
duydo,Viet Nam
|
duydo,Viet Nam
|
||||||
dwainegallimore,United Kingdom
|
dwainegallimore,United Kingdom
|
||||||
dykandDK,
|
dykandDK,
|
||||||
@@ -1094,6 +1101,7 @@ ettoreboy,
|
|||||||
euneuneu,
|
euneuneu,
|
||||||
evalevil,China
|
evalevil,China
|
||||||
everconnectcn,
|
everconnectcn,
|
||||||
|
everestlion,
|
||||||
evertonerik,
|
evertonerik,
|
||||||
evnb,United States
|
evnb,United States
|
||||||
excodex,United Kingdom
|
excodex,United Kingdom
|
||||||
@@ -1358,6 +1366,7 @@ jokob-sk,
|
|||||||
joluas,
|
joluas,
|
||||||
jonaslang1,Germany
|
jonaslang1,Germany
|
||||||
jonathanweinberg,
|
jonathanweinberg,
|
||||||
|
jonbeckman,
|
||||||
jonssonjunior94,
|
jonssonjunior94,
|
||||||
joostiphone,
|
joostiphone,
|
||||||
jopacar1,
|
jopacar1,
|
||||||
@@ -1959,6 +1968,7 @@ starbuck93,United States
|
|||||||
steef84,
|
steef84,
|
||||||
stef-th,
|
stef-th,
|
||||||
stefangries,
|
stefangries,
|
||||||
|
steinmaerivoet,Belgium
|
||||||
stephenjharrington,
|
stephenjharrington,
|
||||||
stepping-razor,Czechia
|
stepping-razor,Czechia
|
||||||
stetho,United Kingdom
|
stetho,United Kingdom
|
||||||
@@ -2179,5 +2189,6 @@ zjw57,China
|
|||||||
zking7,
|
zking7,
|
||||||
zonorti,Germany
|
zonorti,Germany
|
||||||
zr-idt,
|
zr-idt,
|
||||||
|
zuranthus,Sweden
|
||||||
zweehn,
|
zweehn,
|
||||||
zymotik,Germany
|
zymotik,Germany
|
||||||
|
|||||||
|
BIN
.github/stargazer_map.png
vendored
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 62 KiB |
BIN
.github/stats.png
vendored
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 2.2 KiB |
BIN
.github/stats_addons.png
vendored
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
baikal/stats.png
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
bazarr/stats.png
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
codex/stats.png
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 1.7 KiB |
BIN
emby/stats.png
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
ente/stats.png
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1,4 +1,11 @@
|
|||||||
|
|
||||||
|
## debian-2025-11-19 (2025-11-19)
|
||||||
|
- Recreate a default config.json when only a legacy config.yaml is present so upgrades keep a usable configuration file
|
||||||
|
|
||||||
|
## debian-2025-11-18 (2025-11-18)
|
||||||
|
- Restore the default configuration template to config.json with the expected sample values
|
||||||
|
- Recreate a default config.json when only a legacy config.yaml is present so upgrades keep a usable configuration file
|
||||||
|
|
||||||
## debian-2025-11-16 (2025-11-16)
|
## debian-2025-11-16 (2025-11-16)
|
||||||
- Update to latest version from charlocharlie/epicgames-freegames
|
- Update to latest version from charlocharlie/epicgames-freegames
|
||||||
## "debian-2025-11-09" (09-11-2025)
|
## "debian-2025-11-09" (09-11-2025)
|
||||||
|
|||||||
@@ -28,13 +28,13 @@ This addon is based on the docker image https://hub.docker.com/r/charlocharlie/e
|
|||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
Addon options expose the `env_vars` field for passing extra environment variables; all other configuration is done via JSON files.
|
Addon options expose the `env_vars` field for passing extra environment variables; all other configuration is done via the JSON file.
|
||||||
|
|
||||||
### Configuration Files
|
### Configuration Files
|
||||||
|
|
||||||
Configuration files are stored in `/config/addons_config/epicgamesfree/`:
|
Configuration files are stored in `/config/addons_config/epicgamesfree/`:
|
||||||
|
|
||||||
- **config.yaml**: Main configuration file
|
- **config.json**: Main configuration file
|
||||||
- **cookies.json**: Authentication cookies (optional)
|
- **cookies.json**: Authentication cookies (optional)
|
||||||
|
|
||||||
If these files don't exist, they will be created at first boot with default settings.
|
If these files don't exist, they will be created at first boot with default settings.
|
||||||
@@ -43,23 +43,26 @@ If these files don't exist, they will be created at first boot with default sett
|
|||||||
|
|
||||||
### Basic Configuration
|
### Basic Configuration
|
||||||
|
|
||||||
Create `/config/addons_config/epicgamesfree/config.yaml`:
|
Create `/config/addons_config/epicgamesfree/config.json`:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
"runOnStartup": true,
|
||||||
|
"cronSchedule": "0 */6 * * *",
|
||||||
|
"logLevel": "info",
|
||||||
|
"webPortalConfig": {
|
||||||
|
"baseUrl": "https://epic.example.com"
|
||||||
|
},
|
||||||
"accounts": [
|
"accounts": [
|
||||||
{
|
{
|
||||||
"email": "your-epic-email@example.com",
|
"email": "your-epic-email@example.com",
|
||||||
"password": "your-password",
|
"password": "your-password",
|
||||||
"totp": "OPTIONAL_2FA_SECRET"
|
"totp": "OPTIONAL_2FA_SECRET"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"intervalHours": 24,
|
"notifiers": [
|
||||||
"onlyWeekly": false,
|
{
|
||||||
"searchStrategy": "purchase",
|
"type": "email",
|
||||||
"browserNavigationTimeout": 300000,
|
|
||||||
"notifications": {
|
|
||||||
"email": {
|
|
||||||
"smtpHost": "smtp.gmail.com",
|
"smtpHost": "smtp.gmail.com",
|
||||||
"smtpPort": 587,
|
"smtpPort": 587,
|
||||||
"emailSenderAddress": "notifications@example.com",
|
"emailSenderAddress": "notifications@example.com",
|
||||||
@@ -71,7 +74,7 @@ Create `/config/addons_config/epicgamesfree/config.yaml`:
|
|||||||
"pass": "your-app-password"
|
"pass": "your-app-password"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -80,51 +83,52 @@ Create `/config/addons_config/epicgamesfree/config.yaml`:
|
|||||||
| Option | Type | Description |
|
| Option | Type | Description |
|
||||||
|--------|------|-------------|
|
|--------|------|-------------|
|
||||||
| `accounts` | array | List of Epic Games accounts |
|
| `accounts` | array | List of Epic Games accounts |
|
||||||
| `intervalHours` | number | Check interval in hours (default: 24) |
|
| `cronSchedule` | string | Cron schedule to claim games (default: `0 */6 * * *`) |
|
||||||
| `onlyWeekly` | boolean | Only claim weekly free games |
|
| `runOnStartup` | boolean | Run a claim cycle when the add-on starts |
|
||||||
| `searchStrategy` | string | Search strategy: "purchase" or "claim" |
|
| `logLevel` | string | Application log level |
|
||||||
| `browserNavigationTimeout` | number | Browser timeout in milliseconds |
|
| `webPortalConfig.baseUrl` | string | Base URL used by the included web portal |
|
||||||
| `notifications` | object | Notification settings (email, webhook, etc.) |
|
| `notifiers` | array | Notification targets such as email, Discord, Telegram, Apprise, etc. |
|
||||||
|
|
||||||
### Account Configuration
|
### Account Configuration
|
||||||
|
|
||||||
For each account in the `accounts` array:
|
For each account in the `accounts` array:
|
||||||
|
|
||||||
```json
|
```yaml
|
||||||
{
|
email: account@example.com
|
||||||
"email": "account@example.com",
|
password: password
|
||||||
"password": "password",
|
totp: TOTP_SECRET
|
||||||
"totp": "TOTP_SECRET",
|
onlyWeekly: true
|
||||||
"onlyWeekly": true
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Notification Methods
|
### Notification Methods
|
||||||
|
|
||||||
#### Email Notifications
|
#### Email Notifications
|
||||||
```json
|
```yaml
|
||||||
"notifications": {
|
notifications:
|
||||||
"email": {
|
email:
|
||||||
"smtpHost": "smtp.gmail.com",
|
smtpHost: smtp.gmail.com
|
||||||
"smtpPort": 587,
|
smtpPort: 587
|
||||||
"emailSenderAddress": "sender@example.com",
|
emailSenderAddress: sender@example.com
|
||||||
"emailRecipientAddress": "recipient@example.com",
|
emailRecipientAddress: recipient@example.com
|
||||||
"secure": false,
|
secure: false
|
||||||
"auth": {
|
auth:
|
||||||
"user": "sender@example.com",
|
user: sender@example.com
|
||||||
"pass": "app-password"
|
pass: app-password
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Webhook Notifications
|
#### Webhook Notifications
|
||||||
```json
|
```json
|
||||||
"notifications": {
|
{
|
||||||
"webhook": {
|
"notifiers": [
|
||||||
"url": "https://your-webhook-url.com",
|
{
|
||||||
"events": ["purchase-success", "already-owned"]
|
"type": "webhook",
|
||||||
}
|
"url": "https://your-webhook-url.com",
|
||||||
|
"events": [
|
||||||
|
"purchase-success",
|
||||||
|
"already-owned"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -144,9 +148,11 @@ For detailed cookie import instructions, see: https://github.com/claabs/epicgame
|
|||||||
### Troubleshooting
|
### Troubleshooting
|
||||||
|
|
||||||
#### Timeout Errors
|
#### Timeout Errors
|
||||||
Add the following to your config.yaml:
|
Add the following to your config.json:
|
||||||
```json
|
```json
|
||||||
"browserNavigationTimeout": 300000
|
{
|
||||||
|
"browserNavigationTimeout": 300000
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Login Issues
|
#### Login Issues
|
||||||
@@ -172,7 +178,7 @@ The installation of this add-on is pretty straightforward and not different in c
|
|||||||
|
|
||||||
### Timeout error
|
### Timeout error
|
||||||
|
|
||||||
Please try adding `"browserNavigationTimeout": 300000,` to your config.yaml (https://github.com/alexbelgium/hassio-addons/issues/675#issuecomment-1407675351)
|
Please try adding `"browserNavigationTimeout": 300000,` to your config.json (https://github.com/alexbelgium/hassio-addons/issues/675#issuecomment-1407675351)
|
||||||
|
|
||||||
### Other errors
|
### Other errors
|
||||||
|
|
||||||
|
|||||||
@@ -86,5 +86,5 @@ schema:
|
|||||||
slug: epicgamesfree
|
slug: epicgamesfree
|
||||||
udev: true
|
udev: true
|
||||||
url: https://github.com/alexbelgium/hassio-addons
|
url: https://github.com/alexbelgium/hassio-addons
|
||||||
version: "debian-2025-11-16"
|
version: "debian-2025-11-19"
|
||||||
webui: "[PROTO:ssl]://[HOST]:[PORT:3000]"
|
webui: "[PROTO:ssl]://[HOST]:[PORT:3000]"
|
||||||
|
|||||||
@@ -7,15 +7,22 @@ set -e
|
|||||||
##############
|
##############
|
||||||
|
|
||||||
HOME="/config/addons_config/epicgamesfree"
|
HOME="/config/addons_config/epicgamesfree"
|
||||||
if [ ! -f "$HOME"/config.json ]; then
|
CONFIG_JSON="$HOME/config.json"
|
||||||
|
LEGACY_YAML="$HOME/config.yaml"
|
||||||
|
|
||||||
|
if [ ! -f "$CONFIG_JSON" ]; then
|
||||||
|
if [ -f "$LEGACY_YAML" ]; then
|
||||||
|
bashio::log.warning "A legacy config.yaml was found. A default config.json will be created. Please migrate your settings to the new file format and restart the add-on"
|
||||||
|
fi
|
||||||
|
|
||||||
# Copy default config.json
|
# Copy default config.json
|
||||||
cp /templates/config.json "$HOME"/config.json
|
cp /templates/config.json "$CONFIG_JSON"
|
||||||
chmod 755 "$HOME"/config.json
|
chmod 755 "$CONFIG_JSON"
|
||||||
bashio::log.warning "A default config.json file was copied in $HOME. Please customize according to https://github.com/claabs/epicgames-freegames-node#json-configuration and restart the add-on"
|
bashio::log.warning "A default config.json file was copied in $HOME. Please customize according to https://github.com/claabs/epicgames-freegames-node#configuration and restart the add-on"
|
||||||
sleep 5
|
sleep 5
|
||||||
bashio::exit.nok
|
bashio::exit.nok
|
||||||
else
|
else
|
||||||
bashio::log.warning "The config.json file found in $HOME will be used. Please customize according to https://github.com/claabs/epicgames-freegames-node#json-configuration and restart the add-on"
|
bashio::log.warning "The config.json file found in $HOME will be used. Please customize according to https://github.com/claabs/epicgames-freegames-node#configuration and restart the add-on"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Permissions
|
# Permissions
|
||||||
|
|||||||
78
epicgamesfree/rootfs/templates/config.json
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
"runOnStartup":true,
|
||||||
|
"cronSchedule":"0 */6 * * *",
|
||||||
|
"logLevel":"info",
|
||||||
|
"webPortalConfig":{
|
||||||
|
"baseUrl":"https://epic.example.com"
|
||||||
|
},
|
||||||
|
"accounts":[
|
||||||
|
{
|
||||||
|
"email":"example@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"notifiers":[
|
||||||
|
{
|
||||||
|
"type":"email",
|
||||||
|
"smtpHost":"smtp.gmail.com",
|
||||||
|
"smtpPort":587,
|
||||||
|
"emailSenderAddress":"hello@gmail.com",
|
||||||
|
"emailSenderName":"Epic Games Captchas",
|
||||||
|
"emailRecipientAddress":"hello@gmail.com",
|
||||||
|
"secure":false,
|
||||||
|
"auth":{
|
||||||
|
"user":"hello@gmail.com",
|
||||||
|
"pass":"abc123"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"discord",
|
||||||
|
"webhookUrl":"https://discord.com/api/webhooks/123456789123456789/A-abcdefghijklmn-abcdefghijklmnopqrst12345678-abcdefghijklmnop123456",
|
||||||
|
"mentionedUsers":[
|
||||||
|
"914360712086843432"
|
||||||
|
],
|
||||||
|
"mentionedRoles":[
|
||||||
|
"734548250895319070"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"telegram",
|
||||||
|
"apiUrl":"https://api.telegram.org",
|
||||||
|
"token":"644739147:AAGMPo-Jz3mKRnHRTnrPEDi7jUF1vqNOD5k",
|
||||||
|
"chatId":"-987654321"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"apprise",
|
||||||
|
"apiUrl":"http://192.168.1.2:8000",
|
||||||
|
"urls":"mailto://user:pass@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"pushover",
|
||||||
|
"token":"a172fyyl9gw99p2xi16tq8hnib48p2",
|
||||||
|
"userKey":"uvgidym7l5ggpwu2r8i1oy6diaapll"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"gotify",
|
||||||
|
"apiUrl":"https://gotify.net",
|
||||||
|
"token":"SnL-wAvmfo_QT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"homeassistant",
|
||||||
|
"instance":"https://homeassistant.example.com",
|
||||||
|
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
|
||||||
|
"notifyservice":"mobile_app_smartphone_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"bark",
|
||||||
|
"key":"xxxxxxxxxxxxxxxxxxxxxx",
|
||||||
|
"title":"epicgames-freegames",
|
||||||
|
"group":"epicgames-freegames",
|
||||||
|
"apiUrl":"https://api.day.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type":"ntfy",
|
||||||
|
"webhookUrl":"https://ntfy.example.com/mytopic",
|
||||||
|
"priority":"urgent",
|
||||||
|
"token":"tk_mytoken"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
runOnStartup: true
|
|
||||||
cronSchedule: 0 */6 * * *
|
|
||||||
logLevel: info
|
|
||||||
webPortalConfig:
|
|
||||||
baseUrl: https://epic.example.com
|
|
||||||
accounts:
|
|
||||||
- email: example@gmail.com
|
|
||||||
notifiers:
|
|
||||||
- type: email
|
|
||||||
smtpHost: smtp.gmail.com
|
|
||||||
smtpPort: 587
|
|
||||||
emailSenderAddress: hello@gmail.com
|
|
||||||
emailSenderName: Epic Games Captchas
|
|
||||||
emailRecipientAddress: hello@gmail.com
|
|
||||||
secure: false
|
|
||||||
auth:
|
|
||||||
user: hello@gmail.com
|
|
||||||
pass: abc123
|
|
||||||
- type: discord
|
|
||||||
webhookUrl: https://discord.com/api/webhooks/123456789123456789/A-abcdefghijklmn-abcdefghijklmnopqrst12345678-abcdefghijklmnop123456
|
|
||||||
mentionedUsers:
|
|
||||||
- "914360712086843432"
|
|
||||||
mentionedRoles:
|
|
||||||
- "734548250895319070"
|
|
||||||
- type: telegram
|
|
||||||
apiUrl: https://api.telegram.org
|
|
||||||
token: 644739147:AAGMPo-Jz3mKRnHRTnrPEDi7jUF1vqNOD5k
|
|
||||||
chatId: "-987654321"
|
|
||||||
- type: apprise
|
|
||||||
apiUrl: http://192.168.1.2:8000
|
|
||||||
urls: mailto://user:pass@gmail.com
|
|
||||||
- type: pushover
|
|
||||||
token: a172fyyl9gw99p2xi16tq8hnib48p2
|
|
||||||
userKey: uvgidym7l5ggpwu2r8i1oy6diaapll
|
|
||||||
- type: gotify
|
|
||||||
apiUrl: https://gotify.net
|
|
||||||
token: SnL-wAvmfo_QT
|
|
||||||
- type: homeassistant
|
|
||||||
instance: https://homeassistant.example.com
|
|
||||||
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|
|
||||||
notifyservice: mobile_app_smartphone_name
|
|
||||||
- type: bark
|
|
||||||
key: xxxxxxxxxxxxxxxxxxxxxx
|
|
||||||
title: epicgames-freegames
|
|
||||||
group: epicgames-freegames
|
|
||||||
apiUrl: https://api.day.app
|
|
||||||
- type: ntfy
|
|
||||||
webhookUrl: https://ntfy.example.com/mytopic
|
|
||||||
priority: urgent
|
|
||||||
token: tk_mytoken
|
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
BIN
gitea/stats.png
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.3 KiB |
BIN
grav/stats.png
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -1,3 +1,5 @@
|
|||||||
|
## 2.3.1-3 (23-11-2025)
|
||||||
|
- Minor bugs fixed
|
||||||
## 2.3.1-2 (22-11-2025)
|
## 2.3.1-2 (22-11-2025)
|
||||||
- Minor bugs fixed
|
- Minor bugs fixed
|
||||||
|
|
||||||
|
|||||||
@@ -141,6 +141,6 @@ slug: immich
|
|||||||
udev: true
|
udev: true
|
||||||
url: https://github.com/alexbelgium/hassio-addons
|
url: https://github.com/alexbelgium/hassio-addons
|
||||||
usb: true
|
usb: true
|
||||||
version: 2.3.1-2
|
version: 2.3.1-3
|
||||||
video: true
|
video: true
|
||||||
webui: http://[HOST]:[PORT:8080]
|
webui: http://[HOST]:[PORT:8080]
|
||||||
|
|||||||
BIN
immich/stats.png
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -1,3 +1,5 @@
|
|||||||
|
## 2.3.1-3 (23-11-2025)
|
||||||
|
- Minor bugs fixed
|
||||||
## 2.3.1-2 (22-11-2025)
|
## 2.3.1-2 (22-11-2025)
|
||||||
- Minor bugs fixed
|
- Minor bugs fixed
|
||||||
|
|
||||||
|
|||||||
@@ -140,6 +140,6 @@ slug: immich_noml
|
|||||||
udev: true
|
udev: true
|
||||||
url: https://github.com/alexbelgium/hassio-addons
|
url: https://github.com/alexbelgium/hassio-addons
|
||||||
usb: true
|
usb: true
|
||||||
version: 2.3.1-2
|
version: 2.3.1-3
|
||||||
video: true
|
video: true
|
||||||
webui: http://[HOST]:[PORT:8080]
|
webui: http://[HOST]:[PORT:8080]
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.3 KiB |
BIN
inadyn/stats.png
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -1,3 +1,8 @@
|
|||||||
|
## breaking_versions: 10.11.3-1 (23-11-2025)
|
||||||
|
- Minor bugs fixed
|
||||||
|
|
||||||
|
## 10.11.3-1 (23-11-2025)
|
||||||
|
- Fix optional `i915_enable_guc` setting so the add-on no longer requires a value after updates.
|
||||||
|
|
||||||
## 10.11.3 (22-11-2025)
|
## 10.11.3 (22-11-2025)
|
||||||
- Update to latest version from linuxserver/docker-jellyfin (changelog : https://github.com/linuxserver/docker-jellyfin/releases)
|
- Update to latest version from linuxserver/docker-jellyfin (changelog : https://github.com/linuxserver/docker-jellyfin/releases)
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ options:
|
|||||||
PGID: 0
|
PGID: 0
|
||||||
PUID: 0
|
PUID: 0
|
||||||
data_location: /share/jellyfin
|
data_location: /share/jellyfin
|
||||||
i915_enable_guc: null
|
|
||||||
panel_admin: false
|
panel_admin: false
|
||||||
panel_icon: mdi:billiards-rack
|
panel_icon: mdi:billiards-rack
|
||||||
ports:
|
ports:
|
||||||
@@ -126,5 +125,5 @@ schema:
|
|||||||
slug: jellyfin
|
slug: jellyfin
|
||||||
udev: true
|
udev: true
|
||||||
url: https://github.com/alexbelgium/hassio-addons
|
url: https://github.com/alexbelgium/hassio-addons
|
||||||
version: "10.11.3"
|
version: "10.11.3-1"
|
||||||
video: true
|
video: true
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
joal/stats.png
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
joplin/stats.png
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
kometa/stats.png
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.3 KiB |
BIN
lidarr/stats.png
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
mealie/stats.png
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
monica/stats.png
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.2 KiB |
BIN
mylar3/stats.png
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
nzbget/stats.png
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
omada/stats.png
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
ombi/stats.png
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
piwigo/stats.png
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.4 KiB |
BIN
plex/stats.png
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -1,3 +1,6 @@
|
|||||||
|
## 5.1.2-19 (24-11-2025)
|
||||||
|
- Cycle through ip providers to avoid rate limiting api
|
||||||
|
|
||||||
## 5.1.2-13 (19-11-2025)
|
## 5.1.2-13 (19-11-2025)
|
||||||
- Add IPv4 fallback for WireGuard connections
|
- Add IPv4 fallback for WireGuard connections
|
||||||
|
|
||||||
|
|||||||
@@ -145,4 +145,4 @@ schema:
|
|||||||
slug: qbittorrent
|
slug: qbittorrent
|
||||||
udev: true
|
udev: true
|
||||||
url: https://github.com/alexbelgium/hassio-addons
|
url: https://github.com/alexbelgium/hassio-addons
|
||||||
version: 5.1.2-13
|
version: 5.1.2-19
|
||||||
|
|||||||
@@ -14,9 +14,6 @@ if bashio::config.true 'openvpn_enabled'; then
|
|||||||
bashio::log.info "Openvpn enabled, configuring"
|
bashio::log.info "Openvpn enabled, configuring"
|
||||||
bashio::log.info "----------------------------"
|
bashio::log.info "----------------------------"
|
||||||
|
|
||||||
# Get current ip
|
|
||||||
curl -s ipecho.net/plain > /currentip
|
|
||||||
|
|
||||||
# Function to check for files path
|
# Function to check for files path
|
||||||
function check_path() {
|
function check_path() {
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,4 @@ else
|
|||||||
bashio::log.warning "qBittorrent config file not found. Bind the client manually to interface ${interface_name}."
|
bashio::log.warning "qBittorrent config file not found. Bind the client manually to interface ${interface_name}."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Get current ip
|
|
||||||
curl -s ipecho.net/plain > /currentip
|
|
||||||
|
|
||||||
bashio::log.info "WireGuard prepared with interface ${interface_name} using configuration ${wireguard_config##*/}."
|
bashio::log.info "WireGuard prepared with interface ${interface_name} using configuration ${wireguard_config##*/}."
|
||||||
|
|||||||
@@ -2,14 +2,241 @@
|
|||||||
# shellcheck shell=bash
|
# shellcheck shell=bash
|
||||||
|
|
||||||
WEBUI_PORT=${WEBUI_PORT:-8080}
|
WEBUI_PORT=${WEBUI_PORT:-8080}
|
||||||
|
|
||||||
export PATH="/usr/local/sbin:/usr/local/bin:${PATH}"
|
export PATH="/usr/local/sbin:/usr/local/bin:${PATH}"
|
||||||
|
|
||||||
|
# --- Configuration & Pre-checks ---
|
||||||
|
|
||||||
if bashio::config.true 'silent'; then
|
if bashio::config.true 'silent'; then
|
||||||
sed -i 's|/proc/1/fd/1 hassio;|off;|g' /etc/nginx/nginx.conf
|
sed -i 's|/proc/1/fd/1 hassio;|off;|g' /etc/nginx/nginx.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# --- Helper Functions ---
|
||||||
|
|
||||||
|
_fetch_public_ip() {
|
||||||
|
local resp
|
||||||
|
local url
|
||||||
|
local urls=(
|
||||||
|
"https://icanhazip.com"
|
||||||
|
"https://ifconfig.me/ip"
|
||||||
|
"https://api64.ipify.org"
|
||||||
|
"https://checkip.amazonaws.com"
|
||||||
|
"https://domains.google.com/checkip"
|
||||||
|
"https://ipinfo.io/ip"
|
||||||
|
)
|
||||||
|
local shuffled_urls
|
||||||
|
mapfile -t shuffled_urls < <(printf "%s\n" "${urls[@]}" | shuf)
|
||||||
|
# Loop through the now-randomized list
|
||||||
|
for url in "${shuffled_urls[@]}"; do
|
||||||
|
resp=$(curl -fsS --max-time 5 "${url}" 2>/dev/null || true)
|
||||||
|
resp="${resp//[[:space:]]/}"
|
||||||
|
|
||||||
|
# Validate IPv4 or IPv6
|
||||||
|
if [[ "${resp}" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] || [[ "${resp}" =~ ^[0-9a-fA-F:]+$ ]]; then
|
||||||
|
printf '%s\n' "${resp}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
_fetch_country_code() {
|
||||||
|
local resp
|
||||||
|
local url
|
||||||
|
local urls=(
|
||||||
|
"https://ipapi.co/country/"
|
||||||
|
"http://ip-api.com/line/?fields=countryCode"
|
||||||
|
"https://ipinfo.io/country"
|
||||||
|
)
|
||||||
|
local shuffled_urls_output
|
||||||
|
shuffled_urls_output=$(printf '%s\n' "${urls[@]}" | shuf)
|
||||||
|
while IFS= read -r url; do
|
||||||
|
# Skip empty lines if any
|
||||||
|
[[ -z "${url}" ]] && continue
|
||||||
|
# Fetch the response with a 5-second timeout
|
||||||
|
resp=$(curl -fsS --max-time 5 "${url}" 2>/dev/null || true)
|
||||||
|
# Clean whitespace/newlines
|
||||||
|
resp="${resp//[[:space:]]/}"
|
||||||
|
# Validation: Ensure the response is exactly 2 letters (ISO 3166-1 alpha-2)
|
||||||
|
if [[ "${resp}" =~ ^[A-Za-z]{2}$ ]]; then
|
||||||
|
# Convert to uppercase and print
|
||||||
|
printf '%s\n' "${resp^^}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done <<< "${shuffled_urls_output}" # Process the shuffled output
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
_vpn_monitor_public_ip() {
|
||||||
|
local vpn_label="${1:-VPN}"
|
||||||
|
local current_ip_file="/currentip"
|
||||||
|
local baseline_ip vpn_ip country
|
||||||
|
local interval=${VPN_LEAK_CHECK_INTERVAL:-300}
|
||||||
|
local initial_delay=${VPN_LEAK_INITIAL_DELAY:-60}
|
||||||
|
|
||||||
|
# Pre-flight checks
|
||||||
|
if ! command -v curl >/dev/null 2>&1; then
|
||||||
|
bashio::log.warning "${vpn_label}: curl not found; VPN leak monitoring disabled."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -s "${current_ip_file}" ]]; then
|
||||||
|
bashio::log.warning "${vpn_label}: public ip could not be reached; VPN leak monitoring disabled."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! bashio::fs.file_exists "${current_ip_file}"; then
|
||||||
|
bashio::log.warning "${vpn_label}: baseline IP file ${current_ip_file} not found; VPN leak monitoring disabled."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
baseline_ip="$(tr -d '[:space:]' < "${current_ip_file}")"
|
||||||
|
if [[ -z "${baseline_ip}" ]]; then
|
||||||
|
bashio::log.warning "${vpn_label}: baseline IP in ${current_ip_file} is empty; VPN leak monitoring disabled."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
bashio::log.debug "${vpn_label}: Waiting ${initial_delay}s before first leak check."
|
||||||
|
sleep "${initial_delay}"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
vpn_ip="$(_fetch_public_ip || true)"
|
||||||
|
|
||||||
|
if [[ -z "${vpn_ip}" ]]; then
|
||||||
|
bashio::log.warning "${vpn_label}: Failed to fetch public IP (rate limited or connection down)."
|
||||||
|
else
|
||||||
|
if country="$(_fetch_country_code || true)"; then
|
||||||
|
bashio::log.info "${vpn_label}: Current IP: ${vpn_ip} (${country})"
|
||||||
|
else
|
||||||
|
bashio::log.info "${vpn_label}: Current IP: ${vpn_ip} (Country Unknown)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# LEAK DETECTED
|
||||||
|
if [[ "${vpn_ip}" == "${baseline_ip}" ]]; then
|
||||||
|
bashio::log.fatal "${vpn_label}: VPN LEAK DETECTED! Current IP ${vpn_ip} matches baseline. Stopping container."
|
||||||
|
s6-svscanctl -t /var/run/s6/services 2>/dev/null || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
sleep "${interval}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- WireGuard Specific Logic ---
|
||||||
|
|
||||||
|
_setup_wireguard() {
|
||||||
|
local WIREGUARD_STATE_DIR="/var/run/wireguard"
|
||||||
|
local output=""
|
||||||
|
local status=0
|
||||||
|
|
||||||
|
if ! bashio::fs.file_exists "${WIREGUARD_STATE_DIR}/config"; then
|
||||||
|
bashio::exit.nok 'WireGuard runtime configuration not prepared. Please restart the add-on.'
|
||||||
|
fi
|
||||||
|
|
||||||
|
local wireguard_config
|
||||||
|
wireguard_config="$(cat "${WIREGUARD_STATE_DIR}/config")"
|
||||||
|
local wireguard_interface
|
||||||
|
wireguard_interface="$(cat "${WIREGUARD_STATE_DIR}/interface" 2>/dev/null || echo 'wg0')"
|
||||||
|
|
||||||
|
if ip link show "${wireguard_interface}" >/dev/null 2>&1; then
|
||||||
|
bashio::log.warning "WireGuard interface ${wireguard_interface} already exists. Resetting."
|
||||||
|
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
bashio::log.info "Starting WireGuard interface ${wireguard_interface}..."
|
||||||
|
|
||||||
|
# Internal helper: fallback for iptables-legacy
|
||||||
|
_wg_prepare_legacy() {
|
||||||
|
local legacy_bin_dir="${WIREGUARD_STATE_DIR}/iptables-legacy-bin"
|
||||||
|
mkdir -p "${legacy_bin_dir}"
|
||||||
|
local cmd
|
||||||
|
for cmd in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do
|
||||||
|
if command -v "${cmd}-legacy" >/dev/null 2>&1; then
|
||||||
|
ln -sf "$(command -v "${cmd}-legacy")" "${legacy_bin_dir}/${cmd}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
chmod 700 "${legacy_bin_dir}" 2>/dev/null || true
|
||||||
|
export PATH="${legacy_bin_dir}:${PATH}"
|
||||||
|
bashio::log.warning 'Retrying WireGuard using iptables-legacy wrappers.'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Internal helper: Attempt connection
|
||||||
|
_wg_up_attempt() {
|
||||||
|
local config_path="$1"
|
||||||
|
output="$(wg-quick up "${config_path}" 2>&1)" || status=$?
|
||||||
|
|
||||||
|
if [ "${status}" -eq 0 ]; then return 0; fi
|
||||||
|
|
||||||
|
# Check for iptables errors and try legacy fallback
|
||||||
|
if echo "${output}" | grep -qiE 'iptables-restore|ip6tables-restore|xtables'; then
|
||||||
|
if command -v iptables-legacy >/dev/null 2>&1; then
|
||||||
|
wg-quick down "${config_path}" >/dev/null 2>&1 || true
|
||||||
|
_wg_prepare_legacy
|
||||||
|
output="$(wg-quick up "${config_path}" 2>&1)" || status=$?
|
||||||
|
else
|
||||||
|
bashio::log.warning 'iptables errors detected but iptables-legacy missing.'
|
||||||
|
status=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
return "${status}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 1. First Attempt
|
||||||
|
if ! _wg_up_attempt "${wireguard_config}"; then
|
||||||
|
bashio::log.warning 'Initial WireGuard connection failed. Trying IPv4-only endpoints.'
|
||||||
|
bashio::log.debug "Output: ${output}"
|
||||||
|
|
||||||
|
# 2. IPv4 Fallback Preparation
|
||||||
|
local ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf"
|
||||||
|
: > "${ipv4_config}"
|
||||||
|
chmod 600 "${ipv4_config}" 2>/dev/null || true
|
||||||
|
|
||||||
|
local line endpoint endpoint_host endpoint_port
|
||||||
|
while IFS= read -r line || [ -n "$line" ]; do
|
||||||
|
if [[ "${line}" =~ ^Endpoint ]]; then
|
||||||
|
endpoint="${line#Endpoint = }"
|
||||||
|
endpoint_host="${endpoint%:*}"
|
||||||
|
endpoint_port="${endpoint##*:}"
|
||||||
|
|
||||||
|
# Resolve hostname to IPv4
|
||||||
|
mapfile -t ipv4_candidates < <(getent ahostsv4 "${endpoint_host}" | awk '{print $1}' | uniq)
|
||||||
|
|
||||||
|
if [ ${#ipv4_candidates[@]} -gt 0 ]; then
|
||||||
|
bashio::log.debug "Resolved ${endpoint_host} to ${ipv4_candidates[0]}"
|
||||||
|
echo "Endpoint = ${ipv4_candidates[0]}:${endpoint_port}" >> "${ipv4_config}"
|
||||||
|
else
|
||||||
|
echo "${line}" >> "${ipv4_config}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "${line}" >> "${ipv4_config}"
|
||||||
|
fi
|
||||||
|
done < "${wireguard_config}"
|
||||||
|
|
||||||
|
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
|
# 3. Second Attempt (IPv4 only)
|
||||||
|
if ! _wg_up_attempt "${ipv4_config}"; then
|
||||||
|
bashio::log.error 'WireGuard failed to establish connection.'
|
||||||
|
bashio::log.error "${output}"
|
||||||
|
bashio::exit.nok 'WireGuard start failed.'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
bashio::log.info "WireGuard interface ${wireguard_interface} is up."
|
||||||
|
|
||||||
|
# DNS Refresh
|
||||||
|
if command -v resolvconf >/dev/null 2>&1; then
|
||||||
|
resolvconf -u >/dev/null 2>&1 || bashio::log.warning 'resolvconf -u failed.'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Main Execution ---
|
||||||
|
|
||||||
|
echo "$(_fetch_public_ip || true)" > /currentip
|
||||||
|
|
||||||
if bashio::config.true 'openvpn_enabled'; then
|
if bashio::config.true 'openvpn_enabled'; then
|
||||||
|
# Start Leak Monitor
|
||||||
|
_vpn_monitor_public_ip "OpenVPN" &
|
||||||
|
|
||||||
exec /usr/sbin/openvpn \
|
exec /usr/sbin/openvpn \
|
||||||
--config /config/openvpn/config.ovpn \
|
--config /config/openvpn/config.ovpn \
|
||||||
--script-security 2 \
|
--script-security 2 \
|
||||||
@@ -19,133 +246,29 @@ if bashio::config.true 'openvpn_enabled'; then
|
|||||||
--pull-filter ignore "ifconfig-ipv6" \
|
--pull-filter ignore "ifconfig-ipv6" \
|
||||||
--pull-filter ignore "tun-ipv6" \
|
--pull-filter ignore "tun-ipv6" \
|
||||||
--pull-filter ignore "redirect-gateway ipv6" \
|
--pull-filter ignore "redirect-gateway ipv6" \
|
||||||
--pull-filter ignore "dhcp-option DNS6"
|
--pull-filter ignore "dhcp-option DNS6" \
|
||||||
else
|
&
|
||||||
if bashio::config.true 'wireguard_enabled'; then
|
|
||||||
WIREGUARD_STATE_DIR="/var/run/wireguard"
|
|
||||||
|
|
||||||
if ! bashio::fs.file_exists "${WIREGUARD_STATE_DIR}/config"; then
|
elif bashio::config.true 'wireguard_enabled'; then
|
||||||
bashio::exit.nok 'WireGuard runtime configuration not prepared. Please restart the add-on.'
|
|
||||||
fi
|
# Run modularized WireGuard setup
|
||||||
|
_setup_wireguard
|
||||||
|
|
||||||
wireguard_config="$(cat "${WIREGUARD_STATE_DIR}/config")"
|
# Start Leak Monitor
|
||||||
wireguard_interface="$(cat "${WIREGUARD_STATE_DIR}/interface" 2>/dev/null || echo 'wg0')"
|
_vpn_monitor_public_ip "WireGuard" &
|
||||||
|
|
||||||
if ip link show "${wireguard_interface}" &> /dev/null; then
|
|
||||||
bashio::log.warning "WireGuard interface ${wireguard_interface} already exists. Attempting to reset it."
|
|
||||||
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
bashio::log.info "Starting WireGuard interface ${wireguard_interface} using ${wireguard_config##*/}."
|
|
||||||
|
|
||||||
# Prefer host-provided iptables-legacy binaries if the default backend fails.
|
|
||||||
_wireguard_prepare_iptables_legacy() {
|
|
||||||
local legacy_bin_dir="${WIREGUARD_STATE_DIR}/iptables-legacy-bin"
|
|
||||||
mkdir -p "${legacy_bin_dir}"
|
|
||||||
|
|
||||||
for cmd in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do
|
|
||||||
if command -v "${cmd}-legacy" >/dev/null 2>&1; then
|
|
||||||
ln -sf "$(command -v "${cmd}-legacy")" "${legacy_bin_dir}/${cmd}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
chmod 700 "${legacy_bin_dir}" 2>/dev/null || true
|
|
||||||
export PATH="${legacy_bin_dir}:${PATH}"
|
|
||||||
bashio::log.warning 'Retrying WireGuard bring-up using iptables-legacy wrappers.'
|
|
||||||
}
|
|
||||||
|
|
||||||
_wireguard_up_with_iptables_fallback() {
|
|
||||||
local config_path="$1"
|
|
||||||
local status
|
|
||||||
|
|
||||||
output=""
|
|
||||||
output=$(wg-quick up "${config_path}" 2>&1)
|
|
||||||
status=$?
|
|
||||||
|
|
||||||
if [ "$status" -eq 0 ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if echo "${output}" | grep -qiE 'iptables-restore|ip6tables-restore|xtables'; then
|
|
||||||
if command -v iptables-legacy >/dev/null 2>&1 || command -v ip6tables-legacy >/dev/null 2>&1; then
|
|
||||||
wg-quick down "${config_path}" >/dev/null 2>&1 || true
|
|
||||||
_wireguard_prepare_iptables_legacy
|
|
||||||
output=$(wg-quick up "${config_path}" 2>&1)
|
|
||||||
status=$?
|
|
||||||
else
|
|
||||||
bashio::log.warning 'iptables errors detected but iptables-legacy binaries are unavailable in the image.'
|
|
||||||
status=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
return "${status}"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ! _wireguard_up_with_iptables_fallback "${wireguard_config}"; then
|
|
||||||
bashio::log.warning 'Initial WireGuard connection attempt failed. Trying again with IPv4-only endpoints.'
|
|
||||||
bashio::log.warning "First attempt output:${bashio::constants.LF}${output}"
|
|
||||||
|
|
||||||
ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf"
|
|
||||||
echo -n > "${ipv4_config}"
|
|
||||||
chmod 600 "${ipv4_config}" 2>/dev/null || true
|
|
||||||
|
|
||||||
while IFS= read -r line; do
|
|
||||||
if [[ "${line}" =~ ^Endpoint ]]; then
|
|
||||||
endpoint="${line#Endpoint = }"
|
|
||||||
endpoint_host="${endpoint%:*}"
|
|
||||||
endpoint_port="${endpoint##*:}"
|
|
||||||
|
|
||||||
mapfile -t ipv4_candidates < <(getent ahostsv4 "${endpoint_host}" | awk '{print $1}' | uniq)
|
|
||||||
|
|
||||||
if [ ${#ipv4_candidates[@]} -gt 0 ]; then
|
|
||||||
bashio::log.debug "Resolved ${endpoint_host} to IPv4 address ${ipv4_candidates[0]} for WireGuard fallback."
|
|
||||||
echo "Endpoint = ${ipv4_candidates[0]}:${endpoint_port}" >> "${ipv4_config}"
|
|
||||||
else
|
|
||||||
bashio::log.warning "No IPv4 address found for ${endpoint_host}. Keeping original endpoint for fallback."
|
|
||||||
echo "${line}" >> "${ipv4_config}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "${line}" >> "${ipv4_config}"
|
|
||||||
fi
|
|
||||||
done < "${wireguard_config}"
|
|
||||||
|
|
||||||
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true
|
|
||||||
|
|
||||||
if ! _wireguard_up_with_iptables_fallback "${ipv4_config}"; then
|
|
||||||
bashio::log.error 'WireGuard failed to establish a connection after IPv4-only retry.'
|
|
||||||
bashio::log.error "wg-quick output:"
|
|
||||||
bashio::log.error "${output}"
|
|
||||||
bashio::log.error 'Troubleshooting steps:'
|
|
||||||
bashio::log.error " 1. Confirm that the WireGuard configuration file '${wireguard_config}' exists inside the container and contains valid private/public keys, endpoint and AllowedIPs."
|
|
||||||
bashio::log.error ' 2. Ensure UDP port 51820 (or the port defined in your config) is forwarded on your router to this host and not blocked by your firewall or ISP.'
|
|
||||||
bashio::log.error ' 3. Verify that the configured endpoint (IP/hostname and port) is reachable from this container (e.g. ping or nc from a debug shell).'
|
|
||||||
bashio::log.error ' 4. Check that the system time is correct (NTP); large time drift can break key handshakes.'
|
|
||||||
bashio::log.error ' 5. Confirm that WireGuard kernel support / module is available in the host system.'
|
|
||||||
bashio::log.error ' 6. If DNS names are used for the endpoint, verify DNS resolution from inside the container (e.g. nslookup or dig).'
|
|
||||||
bashio::exit.nok 'WireGuard start failed. See the log above for details.'
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
bashio::log.info "WireGuard interface ${wireguard_interface} is up."
|
|
||||||
|
|
||||||
# Refresh DNS resolver configuration if resolvconf is present
|
|
||||||
if command -v resolvconf >/dev/null 2>&1; then
|
|
||||||
bashio::log.info 'Refreshing DNS resolver configuration via resolvconf -u.'
|
|
||||||
if ! resolvconf -u >/dev/null 2>&1; then
|
|
||||||
bashio::log.warning 'resolvconf -u failed. DNS configuration may not have been updated.'
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
bashio::log.debug 'resolvconf not found in PATH; skipping DNS refresh.'
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if bashio::config.true 'silent'; then
|
|
||||||
exec \
|
|
||||||
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost ${WEBUI_PORT}" \
|
|
||||||
s6-setuidgid abc /usr/bin/qbittorrent-nox --webui-port="${WEBUI_PORT}" > /dev/null
|
|
||||||
else
|
|
||||||
exec \
|
|
||||||
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost ${WEBUI_PORT}" \
|
|
||||||
s6-setuidgid abc /usr/bin/qbittorrent-nox --webui-port="${WEBUI_PORT}"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# --- Launch qBittorrent ---
|
||||||
|
|
||||||
|
# Determine log output based on silent mode
|
||||||
|
QB_OUTPUT="/dev/stdout"
|
||||||
|
if bashio::config.true 'silent'; then
|
||||||
|
QB_OUTPUT="/dev/null"
|
||||||
|
fi
|
||||||
|
|
||||||
|
bashio::log.info "Starting qBittorrent..."
|
||||||
|
|
||||||
|
exec \
|
||||||
|
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost ${WEBUI_PORT}" \
|
||||||
|
s6-setuidgid abc /usr/bin/qbittorrent-nox --webui-port="${WEBUI_PORT}" > "${QB_OUTPUT}"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
radarr/stats.png
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 1.7 KiB |