add docker-compose, open port in firewall

This commit is contained in:
Jurgis Sakalauskas
2024-05-03 15:42:31 +03:00
parent 65763d4a33
commit 416f048421
9 changed files with 86 additions and 16 deletions
+15
View File
@@ -0,0 +1,15 @@
IP_INFO_URL=https://ipinfo.io/json
TRANSMISSION_HOST=localhost
TRANSMISSION_PORT=9091
DOCKER_TRANSMISSION_CWD=/path/to/transmission/docker-compose/yaml/config
DOCKER_TRANSMISSION_SERVICE=transmission
DOCKER_TRANSMISSION_SERVICE_NAME=transmission
DOCKER_GLUETUN_CWD=/path/to/gluetun/docker-compose/yaml/config
DOCKER_GLUETUN_SERVICE=gluetun
DOCKER_GLUETUN_SERVICE_NAME=gluetun
ALLOWED_INTERFACES=tun0
DISALLOWED_COUNTRIES=your_country_code_e_g_LV
DISALLOWED_INTERNAL_IPS=your_internal_ip_e_g_192.168
DISALLOWED_EXT_IPS=your_external_ip
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your_webhook_url
UPDATE_INTERVAL_SECONDS=300
+4 -12
View File
@@ -1,12 +1,4 @@
IP_INFO_URL=https://ipinfo.io/json #this is env file for docker-compose file (not for the apps)
TRANSMISSION_HOST=localhost CONFIG_DIR=/mnt/hdd/transmission-config
TRANSMISSION_PORT=9091 DOWNLOAD_DIR1=/mnt/hdd/downloads
DOCKER_TRANSMISSION_CWD=/path/to/transmission/docker-compose/yaml/config DOWNLOAD_DIR2=/mnt/hdd2/downloads
DOCKER_TRANSMISSION_SERVICE=transmission
DOCKER_TRANSMISSION_SERVICE_NAME=transmission
ALLOWED_INTERFACES=tun0
DISALLOWED_COUNTRIES=your_country_code_e_g_LV
DISALLOWED_INTERNAL_IPS=your_internal_ip_e_g_192.168
DISALLOWED_EXT_IPS=your_external_ip
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your_webhook_url
UPDATE_INTERVAL_SECONDS=300
+4
View File
@@ -0,0 +1,4 @@
VPN_SERVICE_PROVIDER=privatevpn
OPENVPN_USER=user
OPENVPN_PASSWORD=passw
SERVER_COUNTRIES=Sweden,Poland
+9
View File
@@ -0,0 +1,9 @@
PUID=1000
PGID=1000
TZ=Europe/Warsaw
TRANSMISSION_WEB_HOME= #optional
USER= #optional
PASS= #optional
WHITELIST= #optional
PEERPORT= #optional
HOST_WHITELIST= #optional
+2 -1
View File
@@ -1,3 +1,4 @@
node_modules node_modules
.env .env**
!.env**example
.idea .idea
+23
View File
@@ -0,0 +1,23 @@
services:
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
cap_add:
- NET_ADMIN
env_file:
- .env.gluetun
ports:
- "9091:9091/tcp"
- "8000:8000/tcp"
transmission:
image: lscr.io/linuxserver/transmission:latest
container_name: transmission
env_file:
- ./.env.transmission
volumes:
- ${CONFIG_DIR}:/config
- ${DOWNLOAD_DIR1}:${DOWNLOAD_DIR1}
- ${DOWNLOAD_DIR2}:${DOWNLOAD_DIR2}
restart: unless-stopped
network_mode: "service:gluetun"
+7
View File
@@ -60,4 +60,11 @@ export class DockerContainer {
ip: dataRaw[6], ip: dataRaw[6],
} }
} }
async setOpenFirewallPort(port: number) {
const {exitCode: exit0} = await this.exec(`iptables -A INPUT -i tun0 -p tcp --dport ${port} -j ACCEPT`);
const {exitCode: exit1} = await this.exec(`iptables -A INPUT -i tun0 -p udp --dport ${port} -j ACCEPT`);
return exit0 === 0 && exit1 === 0;
}
} }
+16 -2
View File
@@ -20,8 +20,14 @@ export async function setPortFlow() {
settings.dockerTransmission.cwd, settings.dockerTransmission.cwd,
settings.dockerTransmission.serviceName settings.dockerTransmission.serviceName
); );
const gluetunContainer = new DockerContainer(
settings.dockerGluetun.service,
settings.dockerGluetun.cwd,
settings.dockerGluetun.serviceName
);
try { try {
await doSetPortFlow(transmissionClient, transmissionContainer); await doSetPortFlow(transmissionClient, transmissionContainer, gluetunContainer);
} catch (e) { } catch (e) {
console.error('Error in set port flow', e); console.error('Error in set port flow', e);
await downTransmission(transmissionContainer, `Shutting down: error in set port flow.`); await downTransmission(transmissionContainer, `Shutting down: error in set port flow.`);
@@ -29,7 +35,7 @@ export async function setPortFlow() {
await dailyCheckIn(); await dailyCheckIn();
} }
async function doSetPortFlow(transmissionClient: Transmission, transmissionContainer: DockerContainer) { async function doSetPortFlow(transmissionClient: Transmission, transmissionContainer: DockerContainer, gluetunContainer: DockerContainer) {
console.log('Starting set port flow'); console.log('Starting set port flow');
const containerState = await transmissionContainer.getState(); const containerState = await transmissionContainer.getState();
@@ -102,6 +108,14 @@ async function doSetPortFlow(transmissionClient: Transmission, transmissionConta
} }
console.log(`Setting port to ${newPort}`); console.log(`Setting port to ${newPort}`);
const resultOK = await gluetunContainer.setOpenFirewallPort(newPort);
if (!resultOK) {
return await downTransmission(
transmissionContainer,
`Shutting down: could not open new port in gluetun firewall`,
);
}
console.log(`Port in gluetun firewall opened successfully`);
await transmissionClient.setPort(newPort); await transmissionClient.setPort(newPort);
const numPortsChanged = kvDataStorage.get<number>('numPortsChanged') || 0; const numPortsChanged = kvDataStorage.get<number>('numPortsChanged') || 0;
+6 -1
View File
@@ -1,5 +1,5 @@
import dotenv from 'dotenv'; import dotenv from 'dotenv';
dotenv.config(); dotenv.config({ path: '.env.app'});
export const settings = { export const settings = {
ipInfoCommand: `curl ${process.env.IP_INFO_URL ?? 'https://ipinfo.io'}`, ipInfoCommand: `curl ${process.env.IP_INFO_URL ?? 'https://ipinfo.io'}`,
@@ -13,6 +13,11 @@ export const settings = {
service: process.env.DOCKER_TRANSMISSION_SERVICE ?? 'transmission', service: process.env.DOCKER_TRANSMISSION_SERVICE ?? 'transmission',
serviceName: process.env.DOCKER_TRANSMISSION_SERVICE_NAME ?? process.env.DOCKER_TRANSMISSION_SERVICE, serviceName: process.env.DOCKER_TRANSMISSION_SERVICE_NAME ?? process.env.DOCKER_TRANSMISSION_SERVICE,
}, },
dockerGluetun: {
cwd: process.env.DOCKER_GLUETUN_CWD ?? __dirname,
service: process.env.DOCKER_GLUETUN_SERVICE ?? 'gluetun',
serviceName: process.env.DOCKER_GLUETUN_SERVICE_NAME ?? process.env.DOCKER_GLUETUN_SERVICE,
},
allowedInterfaces: process.env.ALLOWED_INTERFACES?.split(',') ?? [], allowedInterfaces: process.env.ALLOWED_INTERFACES?.split(',') ?? [],
disallowedCountries: process.env.DISALLOWED_COUNTRIES?.split(',') ?? [], disallowedCountries: process.env.DISALLOWED_COUNTRIES?.split(',') ?? [],
disallowedIntIps: process.env.DISALLOWED_INTERNAL_IPS?.split(',') ?? [], disallowedIntIps: process.env.DISALLOWED_INTERNAL_IPS?.split(',') ?? [],