From abdc6b1c58f2ebec226ccb6654c4ce4186ce00c0 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Thu, 1 Feb 2018 20:36:09 +0100 Subject: [PATCH] Initial version based on JetBrains License Server 15802 --- .editorconfig | 16 ++++ .gitignore | 6 ++ .res/jetbrains-license-server_docker.png | Bin 0 -> 21289 bytes .res/paypal.png | Bin 0 -> 10070 bytes .travis.yml | 59 +++++++++++++ CHANGELOG.md | 5 ++ Dockerfile | 44 ++++++++++ LICENSE | 21 +++++ README.md | 105 +++++++++++++++++++++++ assets/etc/nginx/nginx.conf | 36 ++++++++ assets/etc/supervisord.conf | 25 ++++++ docker-compose.yml | 53 ++++++++++++ entrypoint.sh | 54 ++++++++++++ 13 files changed, 424 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .res/jetbrains-license-server_docker.png create mode 100644 .res/paypal.png create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/etc/nginx/nginx.conf create mode 100644 assets/etc/supervisord.conf create mode 100644 docker-compose.yml create mode 100644 entrypoint.sh diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3025277 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[{Dockerfile,*.sh,*.yml}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98df5db --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Jetbrains +/.idea +/*.iml + +# App +/.dev diff --git a/.res/jetbrains-license-server_docker.png b/.res/jetbrains-license-server_docker.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8c9859d295d8ceee7b9b3863346b9757d12e6f GIT binary patch literal 21289 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

V-cK5xf?T-Nq@v_2WZ!q${b%#7(aYfSsT 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 e|3l`)ypy9fWVgc8A&WI9^ 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 b@Rf3rYspr1ExX}e0SBWftMaJ|U=sX4ie{W^ literal 0 HcmV?d00001 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3c46c60 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,59 @@ +sudo: required + +services: + - docker + +env: + global: + - VERSION=15802 + - GITHUB_REPO=crazy-max/docker-jetbrains-license-server + - DOCKER_USERNAME=crazymax + - DOCKER_REPONAME=jetbrains-license-server + - DOCKER_VERSION=17.12.0~ce-0~ubuntu + - COMPOSE_VERSION=1.18.0 + - secure: JwfXiiIM4c6E+80O6XHQBhw6IdkerfGxlKo+YHvmtkHyz5Fvpc1ZRvWSZYHZhxE1gocThbKUCy4GsgIyiq+dsER27kdAnnvp6JLw8SZ5OSqtOOLjqCKilN2hwFaS/g6Xc3mGvTo+4ScAc9CDJamDCwGY+6r2g/+IdmCbgqOo8yaD4VkhP4eVB3f4el6F7jEwjo626QDzFZ1LVS0qmmeVBSU+xxfL5HolG+j//hLQ/49XIIGnsWtQmHbX1u2trSESyNRTFdY/KZ7qaW8l+BgLhplKu+YXAExb1POGcKJnffSJjCl22ggX1JUHANMgrcQfZe2DKkUJFqr8FvTCktj+lfAuMYwl3k24zcZHe8eTyBFh8YLs7pn++tOFWg0XcKCWO9vzHgbTf/m95F6tpDMx4Y49jRclJIslxkjf8YIuNvDOO4kPKp2bw4ymqjsayPLx3P4xB8vgvyAZeFBQevUkh3ia/3uCfwEwzWimlT1FTeDUj8h4A9y+zRy/AqGf35LneC/Sbwt5dNaCujAwOGFeCvTp43uYd10S5Rz026ecH/8XlcHzuH4+nUvXDnesRI79+6NkaKl8PdcTx0ZC44jIAULn60rur5ybNkQmv5GWjem1C24izosPuC8bLHYY6BSRPn+vacNZH9SYTw2wHiVunxZORWz4FsYAidFkoaygt9E= # DOCKER_PASSWORD + - secure: CRv5ONsqQ7WPkj/AzVId/EnQJVLcnlrAtCACsPisKWgA6QMACaIeVMKrSLP16/GyvERLmyzIGhIlprfmpiNkPeKlzGpJZBjvQ9gyK6YbexITEFjoBOH+rc27kFALCSKxGhr8m+BpHHmcGqCr79v7bFXE0p5TVFn00WbP7CfDjqAiwpcCF1JSDzA0e1mpHk3z7JXceQg9cdhPmhb1GiPMgbONSeTO3ASA9Hmi2JpwYCMaFcDsevVAA+eKSrQEkjYU3L0O4BRVlxUlWHYPSUEZ7vUlgH2imca6pD/WFYEzULj72MLeI9hpLkuXYUVaxLCBPiNoLKCyMIDsAiq5zyhmQyJFFjPo2l/JTKwtO8JCXR7B6sYp8j5gIir4Izbpm8r6VC8SBtafNcgynfehqs9Ov0yBsKKogo3fb/dSWdwANf36jQ766HaBQkp9NN0PFMLzbeXHaQA248MOP6ObqKsFg1c4iJ1UCY9A59hAUyXT+yAm0Y4auxq21/FEZ8pZFqan5qNaxvo0dP8WfeoVdsQAdZ3u7T4wtsxsO8PWKUA4FEoC3Ic9g5DBVte4SQJ5n6Ni2+DFnq4PZhBdCVwWnHh648sUfKncHdmbqTnIq6bN+RI9ZlY8MyeRKVVbbDU9mrmdM2aWlTeu4HQWd7J6ErHrTRDgkRJxKGbPDUemkX4Nhws= # GITHUB_TOKEN + +before_install: + - sudo apt-get update + - sudo apt-cache madison docker-ce + - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce=${DOCKER_VERSION} + - docker --version + - curl -L https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose + - chmod +x docker-compose + - sudo mv docker-compose /usr/local/bin + - docker-compose --version + - export BRANCH=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo $TRAVIS_PULL_REQUEST_BRANCH; fi) + - export DOCKER_TAG=$(if [ "$BRANCH" == "master" ]; then echo "latest"; else echo $BRANCH; fi) + - export WAN_IP=$(dig +short myip.opendns.com @resolver1.opendns.com) + - echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, PR=$PR, BRANCH=$BRANCH, DOCKER_TAG=$DOCKER_TAG" + +install: + - | + docker build --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \ + --build-arg VCS_REF=${TRAVIS_COMMIT::8} \ + --build-arg VERSION=${VERSION} \ + -t $DOCKER_USERNAME/$DOCKER_REPONAME . + +before_script: + - docker run -d -e JLS_VIRTUAL_HOSTS=$WAN_IP --name $DOCKER_REPONAME $DOCKER_USERNAME/$DOCKER_REPONAME + - sleep 20 + - docker logs $DOCKER_REPONAME + +script: + - docker ps | grep $DOCKER_REPONAME + +after_success: + - test $TRAVIS_PULL_REQUEST = false + && echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin + && docker tag $DOCKER_USERNAME/$DOCKER_REPONAME $DOCKER_USERNAME/$DOCKER_REPONAME:$DOCKER_TAG + && docker tag $DOCKER_USERNAME/$DOCKER_REPONAME $DOCKER_USERNAME/$DOCKER_REPONAME:$VERSION + && docker push $DOCKER_USERNAME/$DOCKER_REPONAME + +branches: + except: + - /^[0-9]/ + +notifications: + webhooks: + secure: aSAfpOXZ2sZF4lR+e0Pi8O1/ePVft0wwSQm6L2nugmk+bIkZO/iC+SaNTK1rbbiba/zEjSmxvtA+3Sx+Sw9eOPZaP3sm6PvaVycukmZeUeVMlDUDDiV1xKshAisYuheVSO4kvRFzqoSo/IwClukHbGtYO9bquxgfy+Nan5wkzx0rzFDNsSChDbAEcnZKXxSrXSlOYVtY1fRcBTq52BwnBJzE4+6zDDNJz47sJY3dhAToodOpg+LkiX6b8kY8iAtEf25HKGrJ+O7mGLJOrtZmHLBQXAhcMHLNGtajuP3xZe/1Nq/rezRzbD/Tv7breXoIABnHR6y7oGf2Iry46Uzeg758AEYNU4FymD2sDz1zF1362OFBDq50pZm/MG2K4YqrKcWoy+TzCm4+H/XzsXG1jootRj2vsy1/QFL6zI/vVk6ZsN2ISSEFrJ2T/SZZWHxhYihGemfaSLoLZ0o316KrJxmzj37YucYjJYY/b+iAQruAFPJLd3vtanHfTaFQdUiXJdU7rrolESKI1zg/1cx5rV8PrnUZJXrSNATXgoyXsEvDRsdekHg8w+6ml6OenhgrNoJYG1c+GFtCf/cUaKe9bw6WniiqXtgw75Tdz0BqzNTu9BibhnDdeKYFBzT6wgsBRs47fgWcnmy++CryMvWymTdiiDnTaljUGB/rikA9QTk= diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d459fc8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 15802-RC1 (2018/02/01) + +* Initial version based on JetBrains License Server 15802 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0364fd1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,44 @@ +FROM openjdk:8-jre-alpine +MAINTAINER CrazyMax + +ARG BUILD_DATE +ARG VCS_REF +ARG VERSION + +LABEL org.label-schema.build-date=$BUILD_DATE \ + org.label-schema.name="jetbrains-license-server" \ + org.label-schema.description="JetBrains License Server image based on Alpine" \ + org.label-schema.version=$VERSION \ + org.label-schema.url="https://github.com/crazy-max/docker-jetbrains-license-server" \ + org.label-schema.vcs-ref=$VCS_REF \ + org.label-schema.vcs-url="https://github.com/crazy-max/docker-jetbrains-license-server" \ + org.label-schema.vendor="CrazyMax" \ + org.label-schema.schema-version="1.0" + +RUN apk --update --no-cache add \ + ca-certificates curl libressl nginx supervisor tzdata zip \ + && rm -rf /var/cache/apk/* /tmp/* + +ENV JLS_PATH="/opt/jetbrains-license-server" \ + JLS_VERSION="15802" \ + JLS_SHA256="e0030be1fd06e2db19576363a388d8b84e7b33c9d48c54f0cfcdc032ddd96181" + +RUN mkdir -p "$JLS_PATH" "/data/registration" "/run/nginx" \ + && curl -L "https://download.jetbrains.com/lcsrv/license-server-installer.zip" -o "/tmp/lsi.zip" \ + && echo "$JLS_SHA256 /tmp/lsi.zip" | sha256sum -c - | grep OK \ + && unzip "/tmp/lsi.zip" -d "$JLS_PATH" \ + && rm -f "/tmp/lsi.zip" \ + && find "$JLS_PATH" -type f -exec chmod 644 {} \; \ + && chmod a+x "$JLS_PATH/bin/license-server.sh" \ + && ln -sf "$JLS_PATH/bin/license-server.sh" "/usr/local/bin/license-server" \ + && ln -sf "/data/registration" "/root/.jb-license-server" \ + && touch "/data/access-config.json" + +ADD entrypoint.sh /entrypoint.sh +ADD assets / + +EXPOSE 80 +VOLUME [ "/data" ] + +ENTRYPOINT [ "/entrypoint.sh" ] +CMD [ "/usr/bin/supervisord", "-c", "/etc/supervisord.conf" ] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..29b1e96 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 CrazyMax + +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 new file mode 100644 index 0000000..5d9be43 --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ +

+ +

+ Version + Build Status + Docker Stars + Docker Pulls + Say Thanks + Donate Paypal +

+ +## About + +🐳 [Jetbrains License Server](https://www.jetbrains.com/help/license_server/getting_started.html) Docker image based on Alpine Linux.
+If you are interested, [check out](https://hub.docker.com/r/crazymax/) my other 🐳 Docker images! + +## Features + +### Included + +* Nginx reverse proxy +* License server completely customizable via environment variables +* Registration data and configuration in a single directory + +### From docker-compose + +* Reverse proxy with [nginx-proxy](https://github.com/jwilder/nginx-proxy) +* Creation/renewal of Let's Encrypt certificates automatically with [letsencrypt-nginx-proxy-companion](https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion) + +## Docker + +### Environment variables + +* `TZ` : The timezone assigned to the container (default to `UTC`) +* `JLS_VIRTUAL_HOSTS` : [Virtual hosts](https://www.jetbrains.com/help/license_server/setting_host_and_port.html#d1010e63) where license server will be available (required ; comma delimited for several hosts) +* `JLS_ACCESS_CONFIG` : JSON file to configure [user restrictions](https://www.jetbrains.com/help/license_server/configuring_user_restrictions.html) (default to `/data/access-config.json`) +* `JLS_STATS_RECIPIENTS` : [Reports recipients](https://www.jetbrains.com/help/license_server/detailed_server_usage_statistics.html#d461e40) email addresses for stats (comma delimited) +* `JLS_SMTP_SERVER` : SMTP server host to use for sending [stats](https://www.jetbrains.com/help/license_server/detailed_server_usage_statistics.html) (stats disabled if empty) +* `JLS_SMTP_PORT` : SMTP server port (default to `25`) +* `JLS_SMTP_USERNAME` : SMTP username (auth disabled if empty) +* `JLS_SMTP_PASSWORD` : SMTP password (auth disabled if empty) +* `JLS_STATS_FROM` : [From address](https://www.jetbrains.com/help/license_server/detailed_server_usage_statistics.html#d461e40) for stats emails +* `JLS_STATS_TOKEN` : Enables an auth token for the [stats API](https://www.jetbrains.com/help/license_server/detailed_server_usage_statistics.html#d461e312) at `/reportApi` (HTTP POST) + +### Volumes + +* `/data` : Contains [registration data](https://www.jetbrains.com/help/license_server/migrate.html) and configuration + +### Ports + +* `80` : HTTP port + +## Usage + +Docker compose is the recommended way to run this image. You can use the following [docker compose template](docker-compose.yml), then run the container : + +```bash +docker-compose up -d +docker-compose logs -f +``` + +Or use the following minimal command : + +```bash +$ docker run -d -p 8000:80 --name jetbrains-license-server \ + -e TZ="Europe/Paris" \ + -e JLS_VIRTUAL_HOSTS=jetbrains-license-server.example.com \ + -v $(pwd)/data:/data \ + crazymax/jetbrains-license-server:latest +``` + +## Update + +You can update Matomo automatically through the UI, it works well. But i recommend to recreate the container whenever i push an update : + +```bash +docker-compose pull +docker-compose up -d +``` + +## Troubleshooting + +If you have any trouble using the license server, check the official [Troubleshooting page](https://www.jetbrains.com/help/license_server/troubleshooting.html) of Jetbrains. + +### Error 403 Passed value of header "Host" is not allowed + +If you've got the following message : + +``` +Passed value of header "Host" is not allowed. Please contact your license server administrator. +``` + +That's because the license server is running behind the Nginx reverse proxy. Please configure virtual hosts using the `JLS_VIRTUAL_HOSTS` variable. + +## How can i help ? + +We welcome all kinds of contributions :raised_hands:!
+The most basic way to show your support is to star :star2: the project, or to raise issues :speech_balloon:
+Any funds donated will be used to help further development on this project! :gift_heart: + +[![Donate Paypal](.res/paypal.png)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3BXL8EBDJALHQ) + +## License + +MIT. See `LICENSE` for more details. diff --git a/assets/etc/nginx/nginx.conf b/assets/etc/nginx/nginx.conf new file mode 100644 index 0000000..2e524d2 --- /dev/null +++ b/assets/etc/nginx/nginx.conf @@ -0,0 +1,36 @@ +daemon off; +user nginx; +error_log stderr error; + +events { + worker_connections 2048; + use epoll; +} + +http { + include mime.types; + default_type application/octet-stream; + + aio threads; + sendfile on; + keepalive_timeout 15; + keepalive_disable msie6; + keepalive_requests 100; + tcp_nopush on; + tcp_nodelay on; + server_tokens off; + gzip off; + + # https://www.jetbrains.com/help/license_server/configuring_secure_connection.html + server { + listen 80; + location / { + proxy_set_header X-Forwarded-Host $http_host; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_pass http://127.0.0.1:8080/; + } + } +} diff --git a/assets/etc/supervisord.conf b/assets/etc/supervisord.conf new file mode 100644 index 0000000..bd09ea1 --- /dev/null +++ b/assets/etc/supervisord.conf @@ -0,0 +1,25 @@ +[supervisord] +nodaemon=true +pidfile=/var/run/supervisord.pid + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock + +[unix_http_server] +file=/var/run/supervisor.sock + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[program:license-server] +priority=1 +command=/usr/local/bin/license-server run +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +redirect_stderr=true + +[program:nginx] +command=/usr/sbin/nginx +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +redirect_stderr=true diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0fd3650 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,53 @@ +version: '3' + +services: + proxy: + image: jwilder/nginx-proxy:alpine + labels: + - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true + ports: + - 80:80 + - 443:443 + volumes: + - ./proxy/conf.d:/etc/nginx/conf.d:rw + - ./proxy/vhost.d:/etc/nginx/vhost.d:rw + - ./proxy/html:/usr/share/nginx/html:rw + - ./proxy/certs:/etc/nginx/certs:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/tmp/docker.sock:ro + restart: always + + letsencrypt: + image: jrcs/letsencrypt-nginx-proxy-companion + depends_on: + - proxy + volumes: + - ./proxy/certs:/etc/nginx/certs:rw + - ./proxy/vhost.d:/etc/nginx/vhost.d:rw + - ./proxy/html:/usr/share/nginx/html:rw + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + restart: always + + app: + image: crazymax/jetbrains-license-server:latest + depends_on: + - letsencrypt + - proxy + volumes: + - ./data:/data + environment: + - TZ=Europe/Paris + - JLS_VIRTUAL_HOSTS=jetbrains-license-server.example.com,an-other-host.example.com + - JLS_ACCESS_CONFIG=/data/access-config.json + - JLS_STATS_RECIPIENTS=webmaster@example.com,an-other-address@example.com + - JLS_SMTP_SERVER=smtp.example.com + - JLS_SMTP_PORT=25 + - JLS_SMTP_USERNAME=smtp@example.com + - JLS_SMTP_PASSWORD= + - JLS_STATS_FROM=jetbrains@example.com + - JLS_STATS_TOKEN=1BFC67F51AAF99E85C2347B72E62C + - VIRTUAL_HOST=jetbrains-license-server.example.com + - LETSENCRYPT_HOST=jetbrains-license-server.example.com + - LETSENCRYPT_EMAIL=webmaster@example.com + restart: always diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..8e038af --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +JLS_PATH="/opt/jetbrains-license-server" +JLS_LISTEN_ADDRESS="127.0.0.1" +JLS_PORT=8080 +JLS_ACCESS_CONFIG=${JLS_ACCESS_CONFIG:-"/data/access-config.json"} + +# https://www.jetbrains.com/help/license_server/setting_host_and_port.html +echo "Configuring Jetbrains License Server..." +license-server configure --listen ${JLS_LISTEN_ADDRESS} --port ${JLS_PORT} + +# https://www.jetbrains.com/help/license_server/setting_host_and_port.html +if [ ! -z "$JLS_VIRTUAL_HOSTS" ] ; then + echo "Following virtual hosts will be used :" + for JLS_VIRTUAL_HOST in $(echo ${JLS_VIRTUAL_HOSTS} | tr "," "\n"); do + echo "-> ${JLS_VIRTUAL_HOST}" + done + license-server configure --jetty.virtualHosts.names=${JLS_VIRTUAL_HOSTS} +fi + +# https://www.jetbrains.com/help/license_server/configuring_user_restrictions.html +if [ -s "$JLS_ACCESS_CONFIG" ]; then + echo "Enabling user restrictions access from $JLS_ACCESS_CONFIG..." + license-server configure --access.config=file:${JLS_ACCESS_CONFIG} +fi + +# https://www.jetbrains.com/help/license_server/detailed_server_usage_statistics.html +if [ ! -z "$JLS_SMTP_SERVER" -a ! -z "$JLS_STATS_RECIPIENTS" ] ; then + JLS_SMTP_PORT=${JLS_SMTP_PORT:-"25"} + echo "Enabling User Reporting via SMTP at $JLS_SMTP_SERVER:$JLS_SMTP_PORT..." + license-server configure --smtp.server ${JLS_SMTP_SERVER} --smtp.server.port ${JLS_SMTP_PORT} + + if [ ! -z "$JLS_SMTP_USERNAME" -a ! -z "$JLS_SMTP_PASSWORD" ] ; then + echo "Using SMTP username $JLS_SMTP_USERNAME with password..." + license-server configure --smtp.server.username ${JLS_SMTP_USERNAME} + license-server configure --smtp.server.password ${JLS_SMTP_PASSWORD} + fi + + if [ ! -z "$JLS_STATS_FROM" ] ; then + echo "Setting stats sender to $JLS_STATS_FROM..." + license-server configure --stats.from ${JLS_STATS_FROM} + fi + + echo "Stats recipients: $JLS_STATS_RECIPIENTS..." + license-server configure --stats.recipients ${JLS_STATS_RECIPIENTS} +fi + +# https://www.jetbrains.com/help/license_server/detailed_server_usage_statistics.html +if [ ! -z "$JLS_STATS_TOKEN" ] ; then + echo "Enabling stats via API at /$JLS_STATS_TOKEN..." + license-server configure --reporting.token ${JLS_STATS_TOKEN} +fi + +exec "$@"