diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ef241d8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM alpine as ngrok + +RUN apk add --no-cache --virtual .bootstrap-deps ca-certificates && \ + wget -O /tmp/ngrok.zip https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip && \ + unzip -o /tmp/ngrok.zip -d / && \ + apk del .bootstrap-deps && \ + rm -rf /tmp/* && \ + rm -rf /var/cache/apk/* + +FROM busybox:glibc + +LABEL org.opencontainers.image.description="Ngrok" \ + org.opencontainers.image.authors="HHF Technology (https://forum.hhf.technology/)" \ + org.opencontainers.image.url="https://git.hhf.technology/hhf/docker-ngrok" \ + org.opencontainers.image.documentation="https://git.hhf.technology/hhf/docker-ngrok" \ + org.opencontainers.image.source="https://git.hhf.technology/hhf/docker-ngrok" + +COPY --from=ngrok /ngrok /bin/ngrok +COPY start.sh / + +RUN mkdir -p /home/ngrok /home/ngrok/.ngrok2 && \ + printf 'web_addr: 0.0.0.0:4551' > /home/ngrok/.ngrok2/ngrok.yml && \ + addgroup -g 4551 -S ngrok && \ + adduser -u 4551 -S ngrok -G ngrok -h /home/ngrok -s /bin/ash && \ + chown -R ngrok:ngrok /home/ngrok && \ + chmod +x /start.sh + +USER ngrok:ngrok + +EXPOSE 4551 + +ENTRYPOINT ["/start.sh"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e1eb8ad --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Dmitry Shkoliar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index e69de29..68c4767 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,90 @@ +# Docker Ngrok + +A Docker image for [ngrok](https://ngrok.com) service to expose a local docker environment or any other local server to the public internet over secure tunnels. The image is built using official [busybox:glibc](https://hub.docker.com/_/busybox) docker image, so no third party libraries are used, only official busybox and ngrok binary. + +## Usage + +### Command-line + +**Example** +The example below assumes that you have running web server docker container named `dev_web_1` with exposed port `80`. + +```bash +docker run --rm -it --link dev_web_1 hhftechnologies/ngrok http dev_web_1:80 +``` + +With command line usage, ngrok session is active until it won't be terminated by `Ctrl+C` combination. + +#### Command details + +**Using ngrok parameters** + +```bash +docker run --rm -it --link [--net ] hhftechnologies/ngrok : +``` + +For information about ngrok parameters, please refer to [ngrok documentation](https://ngrok.com/docs). + +**Passing parameters to ngrok via env variables** + +```bash +docker run --rm -it --link [--net ] --env DOMAIN= --env PORT= hhftechnologies/ngrok +``` + +Available env variables can be found below, at [environment variables](#environment-variables) section. + +#### Troubleshooting + +_If you are getting an error like_ + +```bash +docker: Error response from daemon: Cannot link to /dev_web_1, as it does not belong to the default network. +``` + +_You need to specify default docker network, for example_ + +```bash +docker run --rm -it --link dev_web_1 --net dev_default hhftechnologies/ngrok http dev_web_1:80 +``` + +### As part of docker-compose.yml file + +```yaml +ngrok: + image: hhftechnologies/ngrok:latest + ports: + - 4551:4551 + links: + - web + environment: + - DOMAIN=web + - PORT=80 +``` + +Where `web` in example above is a web server service name of this docker-compose.yml file. + +If ngrok container is created as part of docker-compose.yml file, ngrok session is active while container is running. To restart or stop session, you will need to restart or stop container respectively. +Ngrok web interface available at `http://localhost:4551`. + +## Environment variables + +List of available environment variables to configure ngrok in command line usage or as part of docker-compose.yml file. + +| Name | Values | Default | Information | +| :---------- | :------------------------- | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PROTOCOL | http, tls, tcp | http | Ngrok tunneling protocol. | +| DOMAIN | \* | localhost | Hostname or docker container, service name which is referred to by ngrok. | +| PORT | \* | 80 | Port which is referred to by ngrok. | +| REGION | us, eu, ap, au, sa, jp, in | us | Region where the ngrok client will connect to host its tunnels. | +| HOST_HEADER | \* | | Optional, rewrite incoming HTTP requests with a modified Host header. e.g. `HOST_HEADER=localdev.test` | +| BIND_TLS | true, false | | Optional, forward only HTTP or HTTPS traffic, but not both. By default, when ngrok runs an HTTP tunnel, it opens endpoints for both HTTP and HTTPS traffic. | +| SUBDOMAIN | \* | | Optional, specifies the subdomain to use with ngrok, if unspecified ngrok with generate a unique subdomain on each start. | +| AUTH_TOKEN | \* | | Optional, token used to authorise your subdomain with ngrok. | +| DEBUG | true | | Optional, write logs to stdout. | +| PARAMS | \* | | Pass all ngrok parameters by one string. When specified, any other env variables are skipped (Except AUTH_TOKEN).| + +For more information about ngrok parameters, please refer to [ngrok documentation](https://ngrok.com/docs). + +## License + +[MIT](../../blob/master/LICENSE) diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..0715b5b --- /dev/null +++ b/start.sh @@ -0,0 +1,53 @@ +#!/bin/sh -e + +CMD="ngrok" + +$CMD authtoken ${AUTH_TOKEN:-''} > /dev/null + +PARAMS=${PARAMS:-$(echo $@)} + +if [[ -n "$PARAMS" ]]; then + if [[ "$PARAMS" == "$CMD "* ]]; then + CMD="$PARAMS" + else + CMD="$CMD $PARAMS" + fi +else + PROTOCOL=${PROTOCOL:-http} + PORT=${PORT:-80} + + CMD="$CMD $PROTOCOL" + + if [[ -n "$REGION" ]]; then + CMD="$CMD -region=$REGION" + fi + + if [[ -n "$HOST_HEADER" ]]; then + CMD="$CMD -host-header=$HOST_HEADER" + fi + + if [[ -n "$BIND_TLS" ]]; then + CMD="$CMD -bind-tls=$BIND_TLS" + fi + + if [[ -n "$SUBDOMAIN" ]]; then + CMD="$CMD -subdomain=$SUBDOMAIN" + fi + + if [[ -n "$BASICAUTH" ]]; then + CMD="$CMD --auth=$BASICAUTH" + fi + + if [[ -n "$DEBUG" ]]; then + CMD="$CMD -log stdout" + fi + + if [[ -n "$DOMAIN" ]]; then + CMD="$CMD $DOMAIN:$PORT" + else + CMD="$CMD $PORT" + fi +fi + +set -x +exec $CMD