170 lines
3.7 KiB
Markdown
170 lines
3.7 KiB
Markdown
[🇬🇧 English version](README.md)
|
||
|
||
# IONOS DDNS Auto-Updater & Creator
|
||
|
||
Usługa systemowa w Pythonie, która automatycznie aktualizuje rekordy DNS w IONOS.
|
||
W przeciwieństwie do standardowych skryptów DDNS, to rozwiązanie używa **IONOS REST API**, dzięki czemu potrafi:
|
||
|
||
1. **Aktualizować** istniejące rekordy DNS.
|
||
2. **Tworzyć** nowe rekordy DNS automatycznie, jeśli nie istnieją.
|
||
3. Sprawdzać aktualną wartość DNS przed aktualizacją, aby unikać limitów API.
|
||
|
||
---
|
||
|
||
## Funkcje
|
||
|
||
- **Inteligentne sprawdzanie:** porównuje publiczne IP z aktualnym rekordem DNS przed wysłaniem zapytania do API.
|
||
- **Auto-wykrywanie strefy:** automatycznie ustala, do której strefy DNS należy dana domena/subdomena.
|
||
- **Usługa systemowa:** działa jako usługa `systemd` z automatycznym restartem po błędzie.
|
||
- **Logowanie:** szczegółowe logi w `/var/log/ionos-ddns.log`.
|
||
|
||
---
|
||
|
||
## Wymagania
|
||
|
||
- Python 3
|
||
- Konto IONOS z dostępem do **Developer API**
|
||
- Klucz API (Prefix + Secret) wygenerowany na:
|
||
https://developer.hosting.ionos.com/
|
||
|
||
---
|
||
|
||
## Instalacja
|
||
|
||
### 1. Sklonuj repozytorium do `/opt`
|
||
|
||
Zalecana lokalizacja systemowa:
|
||
|
||
```bash
|
||
sudo mkdir -p /opt/ionos-ddns
|
||
cd /opt
|
||
sudo git clone https://git.invelio.co.uk/rafal/ionos-ddns.git
|
||
cd /opt/ionos-ddns
|
||
```
|
||
|
||
### 2. Zainstaluj zależności
|
||
|
||
sudo apt update
|
||
sudo apt install python3-pip
|
||
sudo pip3 install -r requirements.txt
|
||
|
||
### 3. Konfiguracja
|
||
|
||
Edytuj plik konfiguracyjny:
|
||
```
|
||
sudo nano config.json
|
||
```
|
||
Uzupełnij: api_prefix api_secret
|
||
|
||
Lista domen – edytuj plik domains.txt (jedna domena na linię):
|
||
```
|
||
sudo nano domains.txt
|
||
```
|
||
Przykład:
|
||
```
|
||
mydomain.com
|
||
vpn.mydomain.com
|
||
server.other-domain.net
|
||
```
|
||
Zabezpieczenie klucza API
|
||
|
||
Ponieważ config.json zawiera wrażliwe dane, ustaw prawa tylko dla roota:
|
||
```
|
||
sudo chown root:root /opt/ionos-ddns/config.json
|
||
sudo chmod 600 /opt/ionos-ddns/config.json
|
||
```
|
||
Nadaj prawa do uruchomienia skryptu:
|
||
```
|
||
sudo chmod +x /opt/ionos-ddns/update_ddns.py
|
||
```
|
||
### 4. Instalacja usługi systemowej
|
||
|
||
Skopiuj plik usługi:
|
||
```
|
||
sudo cp ionos-ddns.service /etc/systemd/system/
|
||
```
|
||
Przeładuj demona, włącz i uruchom usługę:
|
||
```
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable ionos-ddns.service
|
||
sudo systemctl start ionos-ddns.service
|
||
```
|
||
Monitorowanie
|
||
|
||
Status usługi:
|
||
```
|
||
sudo systemctl status ionos-ddns.service
|
||
```
|
||
Podgląd logów:
|
||
```
|
||
tail -f /var/log/ionos-ddns.log
|
||
```
|
||
Jak to działa
|
||
|
||
Skrypt działa w pętli (co 10 minut):
|
||
|
||
Pobiera Twoje publiczne IP.
|
||
|
||
Wczytuje domains.txt.
|
||
|
||
Dla każdej domeny:
|
||
|
||
znajduje odpowiednie Zone ID przez API,
|
||
|
||
sprawdza czy istnieje rekord A,
|
||
|
||
jeśli istnieje → porównuje IP i wykonuje PUT (update),
|
||
|
||
jeśli nie istnieje → wykonuje POST (create).
|
||
|
||
|
||
### BŁĄD: 400 Invalid API key format
|
||
|
||
Ten błąd oznacza, że serwer IONOS odrzucił klucz, ponieważ jego budowa jest nieprawidłowa.
|
||
|
||
Najczęstsze przyczyny:
|
||
|
||
Spacje (skopiowane przypadkiem przy wklejaniu).
|
||
|
||
Ręczne dodanie kropki w pliku config (skrypt sam dodaje kropkę!).
|
||
|
||
Zły typ klucza (klucz Cloud API zamiast Hosting/DNS API).
|
||
|
||
KROK 1: Sprawdź spacje w config.json
|
||
```
|
||
sudo nano /opt/ionos-ddns/config.json
|
||
```
|
||
Upewnij się, że cudzysłowy przylegają idealnie do znaków.
|
||
|
||
ŹLE (zwróć uwagę na spacje):
|
||
```
|
||
"api_prefix": " 23498723498 ",
|
||
"api_secret": " a1b2c3d4 "
|
||
```
|
||
DOBRZE:
|
||
```
|
||
"api_prefix": "23498723498",
|
||
"api_secret": "a1b2c3d4"
|
||
```
|
||
KROK 2: Nie dodawaj kropki w config.json
|
||
|
||
Skrypt w Pythonie zawiera linię:
|
||
```
|
||
"X-API-Key": f"{prefix}.{secret}"
|
||
```
|
||
On sam łączy te dwie wartości kropką.
|
||
|
||
Jeśli w config.json wpiszesz:
|
||
```
|
||
"api_prefix": "myPrefix."
|
||
```
|
||
skrypt wyśle:
|
||
```
|
||
myPrefix..secret
|
||
```
|
||
(co zawiera dwie kropki) i spowoduje błąd.
|
||
|
||
api_prefix → tylko pierwsza część klucza
|
||
|
||
api_secret → tylko druga, długa część klucza
|