Merge branch 'master' of github.com:byjg/docker-easy-haproxy
This commit is contained in:
commit
9b7e2b6c1d
11 changed files with 112 additions and 10 deletions
19
.github/workflows/build.yml
vendored
19
.github/workflows/build.yml
vendored
|
|
@ -62,6 +62,23 @@ jobs:
|
||||||
with:
|
with:
|
||||||
images: ${{ secrets.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}
|
images: ${{ secrets.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
|
|
||||||
|
- uses: actions/github-script@v6
|
||||||
|
id: tags
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
tags = "${{ join(steps.meta.outputs.tags, ',') }}"
|
||||||
|
result = []
|
||||||
|
tags.split(",").forEach(function (item) {
|
||||||
|
short_tag = item.trim().split(":")[1];
|
||||||
|
if (short_tag != "latest") {
|
||||||
|
result.push(short_tag);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result.join(",");
|
||||||
|
result-encoding: string
|
||||||
|
- name: Get result
|
||||||
|
run: echo "${{steps.set-result.outputs.result}}"
|
||||||
|
|
||||||
# Build and push Docker image with Buildx (don't push on PR)
|
# Build and push Docker image with Buildx (don't push on PR)
|
||||||
# https://github.com/docker/build-push-action
|
# https://github.com/docker/build-push-action
|
||||||
- name: Build and push Docker image
|
- name: Build and push Docker image
|
||||||
|
|
@ -69,6 +86,8 @@ jobs:
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: Dockerfile
|
file: Dockerfile
|
||||||
|
build-args: |
|
||||||
|
RELEASE_VERSION_ARG="${{ join(steps.tags.outputs.result, ',') }}"
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: ${{ github.event_name != 'pull_request' || github.event.inputs.push == 'true' }}
|
push: ${{ github.event_name != 'pull_request' || github.event.inputs.push == 'true' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
FROM alpine:3.16
|
FROM alpine:3.16
|
||||||
|
|
||||||
|
ARG RELEASE_VERSION_ARG
|
||||||
|
|
||||||
|
ENV RELEASE_VERSION=$RELEASE_VERSION_ARG
|
||||||
|
|
||||||
WORKDIR /scripts
|
WORKDIR /scripts
|
||||||
|
|
||||||
COPY requirements.txt /scripts
|
COPY requirements.txt /scripts
|
||||||
|
|
|
||||||
4
Makefile
4
Makefile
|
|
@ -1,6 +1,8 @@
|
||||||
|
VERSION := $(shell git rev-parse --short HEAD)
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build:
|
build:
|
||||||
docker build -t byjg/easy-haproxy -t byjg/easy-haproxy:local .
|
docker build -t byjg/easy-haproxy --build-arg RELEASE_VERSION_ARG="$(VERSION)" -t byjg/easy-haproxy:local .
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test:
|
test:
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,12 @@ docker run --network easyhaproxy byjg/easyhaproxy
|
||||||
docker run --network easyhaproxy myimage
|
docker run --network easyhaproxy myimage
|
||||||
```
|
```
|
||||||
|
|
||||||
|
or, if the container is already created you can join it using the command:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker network connect easyhaproxy mycontainer
|
||||||
|
```
|
||||||
|
|
||||||
### EASYHAPROXY_DISCOVER: swarm
|
### EASYHAPROXY_DISCOVER: swarm
|
||||||
|
|
||||||
This method requires a functional Docker Swarm Cluster. The system will search for the labels in all containers on all
|
This method requires a functional Docker Swarm Cluster. The system will search for the labels in all containers on all
|
||||||
|
|
|
||||||
5
assets/scripts/banner.txt
Normal file
5
assets/scripts/banner.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
_
|
||||||
|
___ __ _ ____ _ ___| |_ __ _ _ __ _ _ _____ ___ _
|
||||||
|
/ -_) _` (_-< || |___| ' \/ _` | '_ \ '_/ _ \ \ / || |
|
||||||
|
\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, |
|
||||||
|
|__/ |_| |__/
|
||||||
|
|
@ -1,8 +1,14 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
source /scripts/functions.sh
|
||||||
|
|
||||||
|
if [ ! -f /scripts/letsencrypt_hosts.txt ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
# Semaphore
|
# Semaphore
|
||||||
if [ -f /tmp/certbot-lock ]; then
|
if [ -f /tmp/certbot-lock ]; then
|
||||||
echo "[CERTBOT_JOB] $(date +"$EASYHAPROXY_DATEFORMAT") Another process is running"
|
log "notice" "CERTBOT_JOB" "Another process is running"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -26,7 +32,7 @@ for domain in $(cat /scripts/letsencrypt_hosts.txt); do
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ -n "$REQUEST_CERTS" ]; then
|
if [ -n "$REQUEST_CERTS" ]; then
|
||||||
echo "[CERTBOT_JOB] $(date +"$EASYHAPROXY_DATEFORMAT") Requesting certificates for $REQUEST_CERTS"
|
log "info" "CERTBOT_JOB" "Requesting certificates for $REQUEST_CERTS"
|
||||||
certbot certonly \
|
certbot certonly \
|
||||||
--standalone \
|
--standalone \
|
||||||
--preferred-challenges http \
|
--preferred-challenges http \
|
||||||
|
|
@ -41,7 +47,7 @@ if [ -n "$REQUEST_CERTS" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$RENEW_CERTS" ]; then
|
if [ -n "$RENEW_CERTS" ]; then
|
||||||
echo "[CERTBOT_JOB] $(date +"$EASYHAPROXY_DATEFORMAT") Resquesting renew certificated fort $RENEW_CERTS"
|
log "info" "CERTBOT_JOB" "Resquesting renew certificated fort $RENEW_CERTS"
|
||||||
certbot renew --post-hook "/scripts/certbot_to_haproxy.sh"
|
certbot renew --post-hook "/scripts/certbot_to_haproxy.sh"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
source /scripts/functions.sh
|
||||||
|
|
||||||
# Loop through all Let's Encrypt certificates
|
# Loop through all Let's Encrypt certificates
|
||||||
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
|
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
|
||||||
CERTIFICATE=`basename $CERTIFICATE`
|
CERTIFICATE=`basename $CERTIFICATE`
|
||||||
|
|
|
||||||
9
assets/scripts/functions.sh
Normal file
9
assets/scripts/functions.sh
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
# ARGS:
|
||||||
|
# - loglevel
|
||||||
|
# - app
|
||||||
|
# - message
|
||||||
|
echo [$2] $(date +"$EASYHAPROXY_DATEFORMAT") [$1]: $3
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,16 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
source /scripts/functions.sh
|
||||||
|
|
||||||
cd /scripts
|
cd /scripts
|
||||||
|
|
||||||
RELOAD="true"
|
RELOAD="true"
|
||||||
|
|
||||||
|
if [[ "static|docker|swarm" != *"$EASYHAPROXY_DISCOVER"* ]];then
|
||||||
|
log "error" "CONF_CHECK" "EASYHAPROXY_DISCOVER should be 'static', 'docker', or 'swarm'. I got '$EASYHAPROXY_DISCOVER' instead."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$EASYHAPROXY_DISCOVER" == "static" ]]; then
|
if [[ "$EASYHAPROXY_DISCOVER" == "static" ]]; then
|
||||||
CONTROL_FILE="/etc/haproxy/haproxy.cfg"
|
CONTROL_FILE="/etc/haproxy/haproxy.cfg"
|
||||||
touch ${CONTROL_FILE}
|
touch ${CONTROL_FILE}
|
||||||
|
|
@ -35,7 +42,7 @@ else
|
||||||
RELOAD="false"
|
RELOAD="false"
|
||||||
else
|
else
|
||||||
python3 swarm.py > /etc/haproxy/haproxy.cfg
|
python3 swarm.py > /etc/haproxy/haproxy.cfg
|
||||||
echo "[CONF_CHECK] $(date +"$EASYHAPROXY_DATEFORMAT") New configuration found"
|
log "info" "CONF_CHECK" "New configuration found"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -44,23 +51,23 @@ if cmp -s ${CONTROL_FILE} ${CONTROL_FILE}.old ; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -z "$1" ]]; then
|
if [[ ! -z "$1" ]]; then
|
||||||
echo "[CONF_CHECK] $(date +"$EASYHAPROXY_DATEFORMAT") Initial configuration. Skip certbot."
|
log "info" "CONF_CHECK" "Initial configuration. Skip certbot."
|
||||||
else
|
else
|
||||||
/scripts/certbot.sh
|
/scripts/certbot.sh
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If Certbot reloads successfully will create the file /tmp/force-reload
|
# If Certbot reloads successfully will create the file /tmp/force-reload
|
||||||
if [ -f /tmp/force-reload ]; then
|
if [ -f /tmp/force-reload ]; then
|
||||||
echo "[CONF_CHECK] $(date +"$EASYHAPROXY_DATEFORMAT") New certificates found..."
|
log "info" "CONF_CHECK" "New certificates found..."
|
||||||
RELOAD="true"
|
RELOAD="true"
|
||||||
rm /tmp/force-reload
|
rm /tmp/force-reload
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -z "$1" ]]; then
|
if [[ ! -z "$1" ]]; then
|
||||||
echo "[CONF_CHECK] $(date +"$EASYHAPROXY_DATEFORMAT") Starting haproxy..."
|
log "info" "CONF_CHECK" "Starting haproxy..."
|
||||||
/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg $(ls /etc/haproxy/conf.d/*.cfg 2>/dev/null | xargs -I{} echo -f {}) -p /run/haproxy.pid -S /var/run/haproxy.sock &
|
/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg $(ls /etc/haproxy/conf.d/*.cfg 2>/dev/null | xargs -I{} echo -f {}) -p /run/haproxy.pid -S /var/run/haproxy.sock &
|
||||||
|
|
||||||
elif [[ "$RELOAD" == "true" ]]; then
|
elif [[ "$RELOAD" == "true" ]]; then
|
||||||
echo "[CONF_CHECK] $(date +"$EASYHAPROXY_DATEFORMAT") Reloading..."
|
log "info" "CONF_CHECK" "Reloading..."
|
||||||
/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg $(ls /etc/haproxy/conf.d/*.cfg 2>/dev/null | xargs -I{} echo -f {}) -p /run/haproxy.pid -x /var/run/haproxy.sock -sf $(cat /run/haproxy.pid) &
|
/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg $(ls /etc/haproxy/conf.d/*.cfg 2>/dev/null | xargs -I{} echo -f {}) -p /run/haproxy.pid -x /var/run/haproxy.sock -sf $(cat /run/haproxy.pid) &
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
source /scripts/functions.sh
|
||||||
|
|
||||||
/usr/sbin/haproxy -v
|
/usr/sbin/haproxy -v
|
||||||
|
|
||||||
if [ -z "$EASYHAPROXY_DATEFORMAT" ]; then
|
if [ -z "$EASYHAPROXY_DATEFORMAT" ]; then
|
||||||
|
|
@ -10,10 +12,18 @@ if [ -z "$EASYHAPROXY_REFRESH_CONF" ]; then
|
||||||
export EASYHAPROXY_REFRESH_CONF=10
|
export EASYHAPROXY_REFRESH_CONF=10
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
cat banner.txt
|
||||||
|
echo Release: $RELEASE_VERSION
|
||||||
|
echo
|
||||||
|
echo "Environment"
|
||||||
|
env | sort | grep 'HAPROXY' | xargs -I{} echo " - {} "
|
||||||
|
echo
|
||||||
|
|
||||||
/scripts/haproxy-reload.sh initial
|
/scripts/haproxy-reload.sh initial
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
sleep $EASYHAPROXY_REFRESH_CONF
|
sleep $EASYHAPROXY_REFRESH_CONF
|
||||||
echo "[CONF_CHECK] $(date +"$EASYHAPROXY_DATEFORMAT") - Heartbeat."
|
log "info" "CONF_CHECK" "Heartbeat."
|
||||||
/scripts/haproxy-reload.sh
|
/scripts/haproxy-reload.sh
|
||||||
done
|
done
|
||||||
|
|
|
||||||
32
docker-compose.yml
Normal file
32
docker-compose.yml
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
easyhaproxy:
|
||||||
|
image: byjg/easy-haproxy:4.1.0
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- certs_letsencrypt:/certs/letsencrypt
|
||||||
|
- certs_haproxy:/certs/haproxy
|
||||||
|
|
||||||
|
environment:
|
||||||
|
EASYHAPROXY_DISCOVER: docker
|
||||||
|
EASYHAPROXY_LABEL_PREFIX: easyhaproxy
|
||||||
|
EASYHAPROXY_LETSENCRYPT_EMAIL: changeme@example.org
|
||||||
|
EASYHAPROXY_SSL_MODE: "default"
|
||||||
|
HAPROXY_CUSTOMERRORS: "true"
|
||||||
|
HAPROXY_USERNAME: admin
|
||||||
|
HAPROXY_PASSWORD: password
|
||||||
|
HAPROXY_STATS_PORT: 1936
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "80:80/tcp"
|
||||||
|
- "443:443/tcp"
|
||||||
|
- "1936:1936/tcp"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
certs_letsencrypt:
|
||||||
|
certs_haproxy:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
easyhaproxy:
|
||||||
|
driver: bridge
|
||||||
Loading…
Add table
Add a link
Reference in a new issue