12 Commits

Author SHA1 Message Date
CrazyMax
00d9088814 Bump 2018-04-20 09:23:50 +02:00
CrazyMax
df68b90d58 Upgrade to JetBrains License Server 16743 2018-04-20 09:22:24 +02:00
CrazyMax
07221d4e58 Replace Nginx + Let's Encrypt with Traefik (see docker-compose) 2018-04-20 09:22:15 +02:00
CrazyMax
0ac0a4c060 Typo 2018-03-20 11:17:30 +01:00
CrazyMax
8265c2539f Upgrade to JetBrains License Server 16429 2018-03-20 11:05:33 +01:00
CrazyMax
1244ac4ad0 Remove build dependencies 2018-02-16 02:25:45 +01:00
CrazyMax
64300ede74 Update docker-compose 2018-02-16 02:09:00 +01:00
CrazyMax
517b60f925 No need of Supervisor 2018-02-16 02:06:26 +01:00
CrazyMax
0440053fa9 Add JLS_REPORT_OUT_OF_LICENSE env var
No need of Supervisor
2018-02-16 02:02:48 +01:00
CrazyMax
a19877c376 Update ignore 2018-02-16 02:02:06 +01:00
CrazyMax
442bad00a3 Update 2018-02-15 22:02:49 +01:00
CrazyMax
45a1cc0557 Add JLS_CONTEXT env var
Ability to set a custom UID / GID
Timezone was not setted
No need of Nginx
Error while saving stats
2018-02-15 16:52:47 +01:00
11 changed files with 131 additions and 146 deletions

5
.gitignore vendored
View File

@@ -1,6 +1,5 @@
/.dev
# Jetbrains
/.idea
/*.iml
# App
/.dev

View File

@@ -5,7 +5,7 @@ services:
env:
global:
- VERSION=15802
- VERSION=16743
- GITHUB_REPO=crazy-max/docker-jetbrains-license-server
- DOCKER_USERNAME=crazymax
- DOCKER_REPONAME=jetbrains-license-server
@@ -37,7 +37,7 @@ 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 .
-t $DOCKER_USERNAME/$DOCKER_REPONAME -f ./docker/Dockerfile ./docker
before_script:
- docker run -d -p 8000:80 -e JLS_VIRTUAL_HOSTS=$WAN_IP --name $DOCKER_REPONAME $DOCKER_USERNAME/$DOCKER_REPONAME

View File

@@ -1,5 +1,22 @@
# Changelog
## 16743-RC1 (2018/04/20)
* Upgrade to JetBrains License Server 16743
* Replace Nginx + Let's Encrypt with Traefik (see docker-compose)
## 16429-RC1 (2018/03/20)
* Upgrade to JetBrains License Server 16429
## 15802-RC2 (2018/02/16)
* Add `JLS_CONTEXT` and `JLS_REPORT_OUT_OF_LICENSE` env vars
* Timezone was not setted
* No need of Nginx and Supervisor
* Error while saving stats
* Remove build dependencies
## 15802-RC1 (2018/02/01)
* Initial version based on JetBrains License Server 15802

View File

@@ -19,25 +19,25 @@ If you are interested, [check out](https://hub.docker.com/r/crazymax/) my other
### 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)
* [Traefik](https://github.com/containous/traefik-library-image) as reverse proxy and creation/renewal of Let's Encrypt certificates
## 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`)
* `TZ` : The timezone assigned to the container (default `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 (comma delimited for several hosts)
* `JLS_CONTEXT` : [Context path](https://www.jetbrains.com/help/license_server/setting_host_and_port.html#d1010e63) used by the license server (default `/`)
* `JLS_ACCESS_CONFIG` : JSON file to configure [user restrictions](https://www.jetbrains.com/help/license_server/configuring_user_restrictions.html) (default `/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_REPORT_OUT_OF_LICENSE` : [Warn about lack of licenses](https://www.jetbrains.com/help/license_server/detailed_server_usage_statistics.html#d461e40) every hour following the percentage threshold (default `0`)
* `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_PORT` : SMTP server port (default `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
@@ -49,13 +49,15 @@ If you are interested, [check out](https://hub.docker.com/r/crazymax/) my other
### Ports
* `80` : HTTP port
* `80` : Jetbrains License Server 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 :
Docker compose is the recommended way to run this image. You can use the following [docker compose template](docker/docker-compose.yml), then run the container :
```bash
touch acme.json
chmod 600 acme.json
docker-compose up -d
docker-compose logs -f
```
@@ -91,7 +93,7 @@ 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.
That's because the license server is running behind a reverse proxy. Please configure virtual hosts using the `JLS_VIRTUAL_HOSTS` variable.
## How can i help ?

View File

@@ -1,36 +0,0 @@
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/;
}
}
}

View File

@@ -1,25 +0,0 @@
[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

View File

@@ -1,53 +0,0 @@
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

1
docker/.dockerignore Normal file
View File

@@ -0,0 +1 @@
/docker-compose.yml

View File

@@ -15,30 +15,30 @@ LABEL org.label-schema.build-date=$BUILD_DATE \
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 \
RUN apk --update --no-cache add tzdata \
&& rm -rf /var/cache/apk/* /tmp/*
ENV JLS_PATH="/opt/jetbrains-license-server" \
JLS_VERSION="15802" \
JLS_SHA256="e0030be1fd06e2db19576363a388d8b84e7b33c9d48c54f0cfcdc032ddd96181"
JLS_VERSION="16743" \
JLS_SHA256="68a7e0e50a7438c02a527fdf9720a92fb1a47a130171ee579b3d778cedf34217"
ADD entrypoint.sh /entrypoint.sh
ADD assets /
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" \
RUN apk --update --no-cache add -t build-dependencies \
curl zip \
&& mkdir -p "$JLS_PATH" \
&& curl -L "https://download.jetbrains.com/lcsrv/license-server-installer.zip" -o "/tmp/jls.zip" \
&& echo "$JLS_SHA256 /tmp/jls.zip" | sha256sum -c - | grep OK \
&& unzip "/tmp/jls.zip" -d "$JLS_PATH" \
&& rm -f "/tmp/jls.zip" \
&& 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" \
&& chmod a+x /entrypoint.sh
&& chmod a+x /entrypoint.sh \
&& apk del build-dependencies \
&& rm -rf /var/cache/apk/* /tmp/*
EXPOSE 80
VOLUME [ "/data" ]
ENTRYPOINT [ "/entrypoint.sh" ]
CMD [ "/usr/bin/supervisord", "-c", "/etc/supervisord.conf" ]
CMD [ "/usr/local/bin/license-server", "run" ]

62
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,62 @@
version: '3'
services:
traefik:
image: traefik:alpine
command:
- --logLevel=INFO
- --defaultentrypoints=http,https
- --entryPoints=Name:http Address::80 Redirect.EntryPoint:https
- --entryPoints=Name:https Address::443 TLS
- --docker
- --docker.exposedbydefault=false
- --docker.domain=example.com
- --acme=false
- --acme.acmelogging=true
- --acme.email=webmaster@example.com
- --acme.storage=acme.json
- --acme.entryPoint=https
- --acme.onhostrule=true
- --acme.httpchallenge=true
ports:
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
volumes:
- ./acme.json:/acme.json
- /var/run/docker.sock:/var/run/docker.sock
restart: always
app:
image: crazymax/jetbrains-license-server:latest
depends_on:
- traefik
volumes:
- jetbrains-license-server:/data
labels:
- traefik.enable=true
- traefik.backend=jetbrains-license-server
- traefik.port=80
- traefik.frontend.rule=Host:jetbrains-license-server.example.com,an-other-host.example.com
environment:
- TZ=Europe/Paris
- JLS_VIRTUAL_HOSTS=jetbrains-license-server.example.com,an-other-host.example.com
- JLS_CONTEXT=/
- JLS_ACCESS_CONFIG=/data/access-config.json
- JLS_STATS_RECIPIENTS=webmaster@example.com,an-other-address@example.com
- JLS_REPORT_OUT_OF_LICENSE=90
- 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
restart: always
volumes:
jetbrains-license-server:

View File

@@ -1,13 +1,26 @@
#!/bin/sh
TZ=${TZ:-"UTC"}
JLS_PATH="/opt/jetbrains-license-server"
JLS_LISTEN_ADDRESS="127.0.0.1"
JLS_PORT=8080
JLS_LISTEN_ADDRESS="0.0.0.0"
JLS_PORT=80
JLS_CONTEXT=${JLS_CONTEXT:-"/"}
JLS_ACCESS_CONFIG=${JLS_ACCESS_CONFIG:-"/data/access-config.json"}
# Timezone
echo "Setting timezone to ${TZ}..."
ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime
echo ${TZ} > /etc/timezone
# Init
echo "Initializing files and folders..."
mkdir -p /data/registration
ln -sf "/data/registration" "/root/.jb-license-server"
touch "/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}
license-server configure --listen ${JLS_LISTEN_ADDRESS} --port ${JLS_PORT} --context ${JLS_CONTEXT}
# https://www.jetbrains.com/help/license_server/setting_host_and_port.html
if [ ! -z "$JLS_VIRTUAL_HOSTS" ] ; then
@@ -41,6 +54,11 @@ if [ ! -z "$JLS_SMTP_SERVER" -a ! -z "$JLS_STATS_RECIPIENTS" ] ; then
license-server configure --stats.from ${JLS_STATS_FROM}
fi
if [ "$JLS_REPORT_OUT_OF_LICENSE" -gt 0 ]; then
echo "Setting report out of licence to $JLS_REPORT_OUT_OF_LICENSE%..."
license-server configure --reporting.out.of.license.threshold ${JLS_REPORT_OUT_OF_LICENSE}
fi
echo "Stats recipients: $JLS_STATS_RECIPIENTS..."
license-server configure --stats.recipients ${JLS_STATS_RECIPIENTS}
fi