2021-04-19 00:31:46 +00:00
ARG ALPINE_VERSION = 3 .13
2021-03-03 01:15:14 +00:00
ARG GO_VERSION = 1 .16
2021-01-18 00:58:47 +00:00
ARG BUILDPLATFORM = linux/amd64
2020-08-17 20:39:49 -04:00
2021-01-06 06:10:42 +00:00
FROM --platform=$BUILDPLATFORM golang:${ GO_VERSION } -alpine${ ALPINE_VERSION } AS base
2020-08-17 20:39:49 -04:00
RUN apk --update add git
ENV CGO_ENABLED = 0
WORKDIR /tmp/gobuild
COPY go.mod go.sum ./
2020-09-12 18:06:10 +00:00
RUN go mod download
2021-01-06 06:02:31 +00:00
COPY cmd/ ./cmd/
COPY internal/ ./internal/
2021-01-06 06:10:42 +00:00
FROM --platform=$BUILDPLATFORM base AS test
2021-01-22 13:19:45 +00:00
# Note on the go race detector:
# - we set CGO_ENABLED=1 to have it enabled
# - we install g++ to support the race detector
2021-01-06 06:02:31 +00:00
ENV CGO_ENABLED = 1
2021-01-22 13:19:45 +00:00
RUN apk --update --no-cache add g++
2021-01-06 06:02:31 +00:00
2021-01-06 06:10:42 +00:00
FROM --platform=$BUILDPLATFORM base AS lint
2021-04-19 00:20:43 +00:00
ARG GOLANGCI_LINT_VERSION = v1.39.0
2021-01-06 06:02:31 +00:00
RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | \
sh -s -- -b /usr/local/bin ${ GOLANGCI_LINT_VERSION }
COPY .golangci.yml ./
RUN golangci-lint run --timeout= 10m
2021-01-22 13:20:54 +00:00
FROM --platform=$BUILDPLATFORM base AS tidy
RUN git init && \
git config user.email ci@localhost && \
git config user.name ci && \
git add -A && git commit -m ci && \
sed -i '/\/\/ indirect/d' go.mod && \
go mod tidy && \
git diff --exit-code -- go.mod
2021-01-06 06:10:42 +00:00
FROM --platform=$BUILDPLATFORM base AS build
2021-01-18 00:58:47 +00:00
COPY --from= qmcgaw/xcputranslate:v0.4.0 /xcputranslate /usr/local/bin/xcputranslate
2021-01-06 06:10:42 +00:00
ARG TARGETPLATFORM
2020-08-29 19:14:52 +00:00
ARG VERSION = unknown
ARG BUILD_DATE = "an unknown date"
ARG COMMIT = unknown
2021-01-18 00:58:47 +00:00
RUN GOARCH = " $( xcputranslate -field arch -targetplatform ${ TARGETPLATFORM } ) " \
GOARM = " $( xcputranslate -field arm -targetplatform ${ TARGETPLATFORM } ) " \
2021-01-06 06:10:42 +00:00
go build -trimpath -ldflags= " -s -w \
2020-12-22 13:52:37 +00:00
-X 'main.version=$VERSION' \
-X 'main.buildDate=$BUILD_DATE' \
-X 'main.commit=$COMMIT' \
2021-01-06 06:02:31 +00:00
" -o entrypoint cmd/gluetun/main.go
2020-08-17 20:39:49 -04:00
FROM alpine:${ALPINE_VERSION }
2020-08-29 19:14:52 +00:00
ARG VERSION = unknown
ARG BUILD_DATE = "an unknown date"
ARG COMMIT = unknown
2020-08-17 20:39:49 -04:00
LABEL \
org.opencontainers.image.authors= "quentin.mcgaw@gmail.com" \
org.opencontainers.image.created= $BUILD_DATE \
org.opencontainers.image.version= $VERSION \
2020-08-29 19:14:52 +00:00
org.opencontainers.image.revision= $COMMIT \
2020-08-17 20:39:49 -04:00
org.opencontainers.image.url= "https://github.com/qdm12/gluetun" \
org.opencontainers.image.documentation= "https://github.com/qdm12/gluetun" \
org.opencontainers.image.source= "https://github.com/qdm12/gluetun" \
2020-12-30 22:30:59 +00:00
org.opencontainers.image.title= "VPN swiss-knife like client for multiple VPN providers" \
org.opencontainers.image.description= "VPN swiss-knife like client to tunnel to multiple VPN servers using OpenVPN, IPtables, DNS over TLS, Shadowsocks, an HTTP proxy and Alpine Linux"
2020-08-17 20:39:49 -04:00
ENV VPNSP = pia \
2020-08-30 14:48:57 +00:00
VERSION_INFORMATION = on \
2020-08-17 20:39:49 -04:00
PROTOCOL = udp \
OPENVPN_VERBOSITY = 1 \
2021-02-08 00:05:54 +00:00
OPENVPN_ROOT = yes \
2020-08-17 20:39:49 -04:00
OPENVPN_TARGET_IP = \
2020-09-26 09:33:24 -04:00
OPENVPN_IPV6 = off \
2021-03-13 08:51:05 -05:00
OPENVPN_CUSTOM_CONFIG = \
2020-08-17 20:39:49 -04:00
TZ = \
2020-12-29 16:44:35 +00:00
PUID = \
PGID = \
2020-12-28 01:51:55 +00:00
PUBLICIP_FILE = "/tmp/gluetun/ip" \
2021-02-26 13:02:43 +00:00
# VPN provider settings
2020-12-29 20:02:58 +00:00
OPENVPN_USER = \
2020-12-29 20:05:17 +00:00
OPENVPN_PASSWORD = \
2020-12-29 20:47:56 +00:00
USER_SECRETFILE = /run/secrets/openvpn_user \
PASSWORD_SECRETFILE = /run/secrets/openvpn_password \
2020-08-17 20:39:49 -04:00
REGION = \
COUNTRY = \
CITY = \
2021-02-26 13:02:43 +00:00
PORT = \
2020-12-31 21:50:28 +00:00
SERVER_HOSTNAME = \
2021-02-26 13:02:43 +00:00
# Mullvad only:
2020-08-17 20:39:49 -04:00
ISP = \
2020-10-18 17:15:42 -04:00
OWNED = no \
2021-02-26 13:02:43 +00:00
# Private Internet Access only:
PIA_ENCRYPTION = strong \
PORT_FORWARDING = off \
PORT_FORWARDING_STATUS_FILE = "/tmp/gluetun/forwarded_port" \
# Cyberghost only:
2020-08-17 20:39:49 -04:00
CYBERGHOST_GROUP = "Premium UDP Europe" \
2020-12-29 20:47:56 +00:00
OPENVPN_CLIENTCRT_SECRETFILE = /run/secrets/openvpn_clientcrt \
OPENVPN_CLIENTKEY_SECRETFILE = /run/secrets/openvpn_clientkey \
2021-02-26 13:02:43 +00:00
# Nordvpn only:
2020-08-17 20:39:49 -04:00
SERVER_NUMBER = \
2021-05-08 22:51:59 +00:00
# NordVPN and ProtonVPN only:
2021-05-08 19:32:52 +00:00
SERVER_NAME = \
2020-08-17 20:39:49 -04:00
# Openvpn
OPENVPN_CIPHER = \
OPENVPN_AUTH = \
# DNS over TLS
DOT = on \
DOT_PROVIDERS = cloudflare \
DOT_PRIVATE_ADDRESS = 127.0.0.1/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16,::1/128,fc00::/7,fe80::/10,::ffff:0:0/96 \
DOT_VERBOSITY = 1 \
DOT_VERBOSITY_DETAILS = 0 \
DOT_VALIDATION_LOGLEVEL = 0 \
DOT_CACHING = on \
DOT_IPV6 = off \
BLOCK_MALICIOUS = on \
BLOCK_SURVEILLANCE = off \
BLOCK_ADS = off \
UNBLOCK = \
DNS_UPDATE_PERIOD = 24h \
DNS_PLAINTEXT_ADDRESS = 1.1.1.1 \
DNS_KEEP_NAMESERVER = off \
# Firewall
FIREWALL = on \
FIREWALL_VPN_INPUT_PORTS = \
2020-10-18 09:22:28 -04:00
FIREWALL_INPUT_PORTS = \
2020-10-29 19:23:44 -04:00
FIREWALL_OUTBOUND_SUBNETS = \
2020-08-17 20:39:49 -04:00
FIREWALL_DEBUG = off \
2020-10-31 21:50:31 -04:00
# HTTP proxy
HTTPPROXY = \
HTTPPROXY_LOG = off \
HTTPPROXY_PORT = 8888 \
HTTPPROXY_USER = \
HTTPPROXY_PASSWORD = \
2020-12-29 20:47:56 +00:00
HTTPPROXY_USER_SECRETFILE = /run/secrets/httpproxy_user \
HTTPPROXY_PASSWORD_SECRETFILE = /run/secrets/httpproxy_password \
2020-08-17 20:39:49 -04:00
# Shadowsocks
SHADOWSOCKS = off \
SHADOWSOCKS_LOG = off \
SHADOWSOCKS_PORT = 8388 \
SHADOWSOCKS_PASSWORD = \
2020-12-29 20:47:56 +00:00
SHADOWSOCKS_PASSWORD_SECRETFILE = /run/secrets/shadowsocks_password \
2020-09-12 18:06:10 +00:00
SHADOWSOCKS_METHOD = chacha20-ietf-poly1305 \
UPDATER_PERIOD = 0
2020-08-17 20:39:49 -04:00
ENTRYPOINT [ "/entrypoint" ]
EXPOSE 8000/tcp 8888/tcp 8388/tcp 8388/udp
2020-12-30 19:34:11 +00:00
HEALTHCHECK --interval= 5s --timeout= 5s --start-period= 10s --retries= 1 CMD /entrypoint healthcheck
2020-10-31 21:50:31 -04:00
RUN apk add -q --progress --no-cache --update openvpn ca-certificates iptables ip6tables unbound tzdata && \
rm -rf /var/cache/apk/* /etc/unbound/* /usr/sbin/unbound-* && \
2020-08-17 20:39:49 -04:00
deluser openvpn && \
2020-08-25 19:38:50 -04:00
deluser unbound && \
mkdir /gluetun
2021-01-06 06:02:31 +00:00
COPY --from= build /tmp/gobuild/entrypoint /entrypoint