mirror of
https://github.com/sakaljurgis/pvpn-transmission.git
synced 2026-07-08 20:47:41 +00:00
add docker-compose, open port in firewall
This commit is contained in:
@@ -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
@@ -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
|
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
VPN_SERVICE_PROVIDER=privatevpn
|
||||||
|
OPENVPN_USER=user
|
||||||
|
OPENVPN_PASSWORD=passw
|
||||||
|
SERVER_COUNTRIES=Sweden,Poland
|
||||||
@@ -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
@@ -1,3 +1,4 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.env
|
.env**
|
||||||
|
!.env**example
|
||||||
.idea
|
.idea
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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
@@ -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
@@ -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(',') ?? [],
|
||||||
|
|||||||
Reference in New Issue
Block a user