Na Synology mi v Dockeru běží Nginx Proxy Manager (NPM) a ten chce mít porty 80 a 443 pro sebe. Na nich ale už sedí vestavěný nginx DSM, a tak kontejner při startu skončí s hláškou address already in use.
Co budete potřebovat
- Synology s DSM (já mám DS918+ s DSM 7.1)
- zapnuté SSH (Ovládací panely → Terminál a SNMP → Povolit službu SSH)
- účet ze skupiny administrators, aby fungovalo
sudo - volné porty, na které DSM přesunete – já volím 10080 a 10443
Proč nestačí upravit nginx.conf
První nápad je otevřít /etc/nginx/nginx.conf a přepsat porty tam. Funguje to přesně do chvíle, než DSM konfiguraci vygeneruje znovu – při restartu, při změně čehokoli v Ovládacích panelech nebo při aktualizaci. Zdrojem pravdy jsou šablony v adresáři /usr/syno/share/nginx/, ze kterých se nginx.conf skládá. Upravovat se proto musí ty.
1. Podívejte se, co v šablonách je
Přihlaste se na NAS přes SSH a vypište si všechny řádky s listen, které používají port 80 nebo 443. Spouští se v terminálu na NASu:
sudo grep -nE 'listen[[:space:]]+(\[::\]:)?(80|443)[^0-9]' /usr/syno/share/nginx/*.mustache
Uvidíte, ve kterých souborech a na kterých řádcích se porty nastavují. Typicky jde o dvojice listen 80 a listen [::]:80 (IPv4 a IPv6) a totéž pro 443. Tenhle výpis se hodí mít před očima, ať víte, co se bude měnit.
2. Zálohujte šablony
Než začnete cokoli přepisovat, udělejte si kopii celého adresáře. Je to jeden příkaz a ušetří vám to nervy, kdyby se něco pokazilo 😈
sudo cp -a /usr/syno/share/nginx /root/nginx-mustache-backup
3. Přepište porty na 10080 a 10443
Následující dva příkazy změní port jen v direktivách listen, a to pro IPv4 i IPv6. Jinde v šablonách číslo 80 nebo 443 zůstane, jak je.
sudo sed -i -E 's/^([[:space:]]*listen[[:space:]]+(\[::\]:)?)80([^0-9])/\110080\3/' /usr/syno/share/nginx/*.mustache
sudo sed -i -E 's/^([[:space:]]*listen[[:space:]]+(\[::\]:)?)443([^0-9])/\110443\3/' /usr/syno/share/nginx/*.mustache
Zápis \110080 vypadá podezřele, ale je v pořádku. Sed bere jako zpětný odkaz jen jednu číslici, takže je to \1 (zachycené listen s mezerami) a za ním 10080.
Kontrola – zopakujte grep z kroku 1. Tentokrát by neměl vypsat nic:
sudo grep -nE 'listen[[:space:]]+(\[::\]:)?(80|443)[^0-9]' /usr/syno/share/nginx/*.mustache
Pokud něco vypíše, je na tom řádku listen uprostřed (třeba za značkou šablony) a sed ho nechytil. Takový řádek opravte ručně, například sudo vi nad daným souborem.
4. Restartujte nginx
Na DSM 7 se služby ovládají přes synosystemctl:
sudo synosystemctl restart nginx
DSM při restartu znovu vygeneruje nginx.conf už z upravených šablon.
5. Ověřte, že jsou porty volné
sudo netstat -tlnp | grep -E ':(80|443|10080|10443) '
Výstup by měl ukazovat nginx na portech 10080 a 10443 a na 80 a 443 nic. Teď můžete spustit (nebo restartovat) kontejner s Nginx Proxy Managerem, který si porty 80 a 443 namapuje na sebe.
Pokud je 443 pořád obsazený, mrkněte do Ovládacích panelů → Přihlašovací portál → Upřesnit → Reverzní proxy. Pravidla reverzní proxy z DSM umí port 443 držet i po úpravě šablon, takže je smažte, nebo je převeďte do NPM. Pomohl také restart celého NASu.
Na co si dát pozor
- Web Station a další služby na 80/443. Všechno, co DSM servíroval na standardních portech (Web Station, přesměrování na DSM), se přestěhuje na 10080 a 10443. Samotné rozhraní DSM na 5000 a 5001 to neovlivní.
- Aktualizace DSM. Aktualizace může šablony vrátit do původní podoby a porty 80 a 443 si DSM vezme zpátky. Po každé aktualizaci proto spusťte grep z kroku 1 a případně zopakujte kroky 3 a 4.
- Jiné verze DSM. Na DSM 7.1 to funguje. Lidé na fórech hlásí u novějších verzí (7.2 a 7.3) smíšené výsledky – někomu to jde stejně, jinde DSM port 443 drží dál. Pokud máte novější DSM a porty se neuvolní, zkuste nejdřív smazat pravidla reverzní proxy v DSM a restartovat NAS.
Návrat zpět. Stačí vrátit zálohu a restartovat nginx:
sudo cp -a /root/nginx-mustache-backup/. /usr/syno/share/nginx/
sudo synosystemctl restart nginx
Co teď funguje
NPM má porty 80 a 443 pro sebe, vyřizuje certifikáty od Let’s Encrypt a DSM i Web Station žijí na 10080 a 10443.