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
|
||||
FallsSteven,
|
||||
Felitendo,
|
||||
Filipza,
|
||||
Flipsoo,
|
||||
FloppiTuna,United States
|
||||
Fluffy-Bunny-23,
|
||||
@@ -487,6 +488,7 @@ Rapozillha,Portugal
|
||||
Raw2x2,
|
||||
RdN-J,
|
||||
RealJustMe,
|
||||
Redmno,
|
||||
Reiqu,Germany
|
||||
RemcoSchrijver,Netherlands
|
||||
Rene2302,
|
||||
@@ -494,6 +496,7 @@ RescueWolf-Dreamwalker,
|
||||
RhaaKaye,
|
||||
RicLund,Canada
|
||||
Richyread,
|
||||
RimmeVG,
|
||||
Rimpla,
|
||||
Robbot,Ireland
|
||||
RobertZwets,
|
||||
@@ -581,6 +584,7 @@ Syuq,
|
||||
T-I-M-O-T,
|
||||
TCTnz,
|
||||
THENEXTBIGTIME,
|
||||
TS-1709,
|
||||
TarrX,Germany
|
||||
Tche333,
|
||||
Tchoupinax,
|
||||
@@ -814,6 +818,7 @@ bigsby-exe,United Kingdom
|
||||
bilak,Czechia
|
||||
bitDealer,
|
||||
bjackerman,United States
|
||||
bjoe10,
|
||||
bkuri,Mexico
|
||||
blackshoals,
|
||||
blairun,
|
||||
@@ -946,6 +951,7 @@ ctrlaltprocrastinate,
|
||||
ctyfrank,
|
||||
cuza,Cuba
|
||||
cvladan,
|
||||
cvroque,
|
||||
cwmoriarty,
|
||||
cy1798,
|
||||
cyberjohn60,
|
||||
@@ -1051,6 +1057,7 @@ dtrochow,
|
||||
duckduckuk,United Kingdom
|
||||
duhaijian,
|
||||
dumbledorethor,
|
||||
dutzi88,
|
||||
duydo,Viet Nam
|
||||
dwainegallimore,United Kingdom
|
||||
dykandDK,
|
||||
@@ -1094,6 +1101,7 @@ ettoreboy,
|
||||
euneuneu,
|
||||
evalevil,China
|
||||
everconnectcn,
|
||||
everestlion,
|
||||
evertonerik,
|
||||
evnb,United States
|
||||
excodex,United Kingdom
|
||||
@@ -1358,6 +1366,7 @@ jokob-sk,
|
||||
joluas,
|
||||
jonaslang1,Germany
|
||||
jonathanweinberg,
|
||||
jonbeckman,
|
||||
jonssonjunior94,
|
||||
joostiphone,
|
||||
jopacar1,
|
||||
@@ -1959,6 +1968,7 @@ starbuck93,United States
|
||||
steef84,
|
||||
stef-th,
|
||||
stefangries,
|
||||
steinmaerivoet,Belgium
|
||||
stephenjharrington,
|
||||
stepping-razor,Czechia
|
||||
stetho,United Kingdom
|
||||
@@ -2179,5 +2189,6 @@ zjw57,China
|
||||
zking7,
|
||||
zonorti,Germany
|
||||
zr-idt,
|
||||
zuranthus,Sweden
|
||||
zweehn,
|
||||
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)
|
||||
- Update to latest version from charlocharlie/epicgames-freegames
|
||||
## "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
|
||||
|
||||
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 are stored in `/config/addons_config/epicgamesfree/`:
|
||||
|
||||
- **config.yaml**: Main configuration file
|
||||
- **config.json**: Main configuration file
|
||||
- **cookies.json**: Authentication cookies (optional)
|
||||
|
||||
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
|
||||
|
||||
Create `/config/addons_config/epicgamesfree/config.yaml`:
|
||||
Create `/config/addons_config/epicgamesfree/config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"runOnStartup": true,
|
||||
"cronSchedule": "0 */6 * * *",
|
||||
"logLevel": "info",
|
||||
"webPortalConfig": {
|
||||
"baseUrl": "https://epic.example.com"
|
||||
},
|
||||
"accounts": [
|
||||
{
|
||||
"email": "your-epic-email@example.com",
|
||||
"email": "your-epic-email@example.com",
|
||||
"password": "your-password",
|
||||
"totp": "OPTIONAL_2FA_SECRET"
|
||||
}
|
||||
],
|
||||
"intervalHours": 24,
|
||||
"onlyWeekly": false,
|
||||
"searchStrategy": "purchase",
|
||||
"browserNavigationTimeout": 300000,
|
||||
"notifications": {
|
||||
"email": {
|
||||
"notifiers": [
|
||||
{
|
||||
"type": "email",
|
||||
"smtpHost": "smtp.gmail.com",
|
||||
"smtpPort": 587,
|
||||
"emailSenderAddress": "notifications@example.com",
|
||||
@@ -71,7 +74,7 @@ Create `/config/addons_config/epicgamesfree/config.yaml`:
|
||||
"pass": "your-app-password"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
@@ -80,51 +83,52 @@ Create `/config/addons_config/epicgamesfree/config.yaml`:
|
||||
| Option | Type | Description |
|
||||
|--------|------|-------------|
|
||||
| `accounts` | array | List of Epic Games accounts |
|
||||
| `intervalHours` | number | Check interval in hours (default: 24) |
|
||||
| `onlyWeekly` | boolean | Only claim weekly free games |
|
||||
| `searchStrategy` | string | Search strategy: "purchase" or "claim" |
|
||||
| `browserNavigationTimeout` | number | Browser timeout in milliseconds |
|
||||
| `notifications` | object | Notification settings (email, webhook, etc.) |
|
||||
| `cronSchedule` | string | Cron schedule to claim games (default: `0 */6 * * *`) |
|
||||
| `runOnStartup` | boolean | Run a claim cycle when the add-on starts |
|
||||
| `logLevel` | string | Application log level |
|
||||
| `webPortalConfig.baseUrl` | string | Base URL used by the included web portal |
|
||||
| `notifiers` | array | Notification targets such as email, Discord, Telegram, Apprise, etc. |
|
||||
|
||||
### Account Configuration
|
||||
|
||||
For each account in the `accounts` array:
|
||||
|
||||
```json
|
||||
{
|
||||
"email": "account@example.com",
|
||||
"password": "password",
|
||||
"totp": "TOTP_SECRET",
|
||||
"onlyWeekly": true
|
||||
}
|
||||
```yaml
|
||||
email: account@example.com
|
||||
password: password
|
||||
totp: TOTP_SECRET
|
||||
onlyWeekly: true
|
||||
```
|
||||
|
||||
### Notification Methods
|
||||
|
||||
#### Email Notifications
|
||||
```json
|
||||
"notifications": {
|
||||
"email": {
|
||||
"smtpHost": "smtp.gmail.com",
|
||||
"smtpPort": 587,
|
||||
"emailSenderAddress": "sender@example.com",
|
||||
"emailRecipientAddress": "recipient@example.com",
|
||||
"secure": false,
|
||||
"auth": {
|
||||
"user": "sender@example.com",
|
||||
"pass": "app-password"
|
||||
}
|
||||
}
|
||||
}
|
||||
```yaml
|
||||
notifications:
|
||||
email:
|
||||
smtpHost: smtp.gmail.com
|
||||
smtpPort: 587
|
||||
emailSenderAddress: sender@example.com
|
||||
emailRecipientAddress: recipient@example.com
|
||||
secure: false
|
||||
auth:
|
||||
user: sender@example.com
|
||||
pass: app-password
|
||||
```
|
||||
|
||||
#### Webhook Notifications
|
||||
```json
|
||||
"notifications": {
|
||||
"webhook": {
|
||||
"url": "https://your-webhook-url.com",
|
||||
"events": ["purchase-success", "already-owned"]
|
||||
}
|
||||
{
|
||||
"notifiers": [
|
||||
{
|
||||
"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
|
||||
|
||||
#### Timeout Errors
|
||||
Add the following to your config.yaml:
|
||||
Add the following to your config.json:
|
||||
```json
|
||||
"browserNavigationTimeout": 300000
|
||||
{
|
||||
"browserNavigationTimeout": 300000
|
||||
}
|
||||
```
|
||||
|
||||
#### Login Issues
|
||||
@@ -172,7 +178,7 @@ The installation of this add-on is pretty straightforward and not different in c
|
||||
|
||||
### 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
|
||||
|
||||
|
||||
@@ -86,5 +86,5 @@ schema:
|
||||
slug: epicgamesfree
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
version: "debian-2025-11-16"
|
||||
version: "debian-2025-11-19"
|
||||
webui: "[PROTO:ssl]://[HOST]:[PORT:3000]"
|
||||
|
||||
@@ -7,15 +7,22 @@ set -e
|
||||
##############
|
||||
|
||||
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
|
||||
cp /templates/config.json "$HOME"/config.json
|
||||
chmod 755 "$HOME"/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"
|
||||
cp /templates/config.json "$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#configuration and restart the add-on"
|
||||
sleep 5
|
||||
bashio::exit.nok
|
||||
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
|
||||
|
||||
# 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)
|
||||
- Minor bugs fixed
|
||||
|
||||
|
||||
@@ -141,6 +141,6 @@ slug: immich
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
usb: true
|
||||
version: 2.3.1-2
|
||||
version: 2.3.1-3
|
||||
video: true
|
||||
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)
|
||||
- Minor bugs fixed
|
||||
|
||||
|
||||
@@ -140,6 +140,6 @@ slug: immich_noml
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
usb: true
|
||||
version: 2.3.1-2
|
||||
version: 2.3.1-3
|
||||
video: true
|
||||
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)
|
||||
- Update to latest version from linuxserver/docker-jellyfin (changelog : https://github.com/linuxserver/docker-jellyfin/releases)
|
||||
|
||||
@@ -91,7 +91,6 @@ options:
|
||||
PGID: 0
|
||||
PUID: 0
|
||||
data_location: /share/jellyfin
|
||||
i915_enable_guc: null
|
||||
panel_admin: false
|
||||
panel_icon: mdi:billiards-rack
|
||||
ports:
|
||||
@@ -126,5 +125,5 @@ schema:
|
||||
slug: jellyfin
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
version: "10.11.3"
|
||||
version: "10.11.3-1"
|
||||
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)
|
||||
- Add IPv4 fallback for WireGuard connections
|
||||
|
||||
|
||||
@@ -145,4 +145,4 @@ schema:
|
||||
slug: qbittorrent
|
||||
udev: true
|
||||
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 "----------------------------"
|
||||
|
||||
# Get current ip
|
||||
curl -s ipecho.net/plain > /currentip
|
||||
|
||||
# Function to check for files 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}."
|
||||
fi
|
||||
|
||||
# Get current ip
|
||||
curl -s ipecho.net/plain > /currentip
|
||||
|
||||
bashio::log.info "WireGuard prepared with interface ${interface_name} using configuration ${wireguard_config##*/}."
|
||||
|
||||
@@ -2,14 +2,241 @@
|
||||
# shellcheck shell=bash
|
||||
|
||||
WEBUI_PORT=${WEBUI_PORT:-8080}
|
||||
|
||||
export PATH="/usr/local/sbin:/usr/local/bin:${PATH}"
|
||||
|
||||
# --- Configuration & Pre-checks ---
|
||||
|
||||
if bashio::config.true 'silent'; then
|
||||
sed -i 's|/proc/1/fd/1 hassio;|off;|g' /etc/nginx/nginx.conf
|
||||
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
|
||||
# Start Leak Monitor
|
||||
_vpn_monitor_public_ip "OpenVPN" &
|
||||
|
||||
exec /usr/sbin/openvpn \
|
||||
--config /config/openvpn/config.ovpn \
|
||||
--script-security 2 \
|
||||
@@ -19,133 +246,29 @@ if bashio::config.true 'openvpn_enabled'; then
|
||||
--pull-filter ignore "ifconfig-ipv6" \
|
||||
--pull-filter ignore "tun-ipv6" \
|
||||
--pull-filter ignore "redirect-gateway ipv6" \
|
||||
--pull-filter ignore "dhcp-option DNS6"
|
||||
else
|
||||
if bashio::config.true 'wireguard_enabled'; then
|
||||
WIREGUARD_STATE_DIR="/var/run/wireguard"
|
||||
--pull-filter ignore "dhcp-option DNS6" \
|
||||
&
|
||||
|
||||
if ! bashio::fs.file_exists "${WIREGUARD_STATE_DIR}/config"; then
|
||||
bashio::exit.nok 'WireGuard runtime configuration not prepared. Please restart the add-on.'
|
||||
fi
|
||||
elif bashio::config.true 'wireguard_enabled'; then
|
||||
|
||||
# Run modularized WireGuard setup
|
||||
_setup_wireguard
|
||||
|
||||
wireguard_config="$(cat "${WIREGUARD_STATE_DIR}/config")"
|
||||
wireguard_interface="$(cat "${WIREGUARD_STATE_DIR}/interface" 2>/dev/null || echo 'wg0')"
|
||||
# Start Leak Monitor
|
||||
_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
|
||||
|
||||
# --- 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 |