Compare commits
20 Commits
gitea-work
...
1.10.1
Author | SHA1 | Date | |
---|---|---|---|
fdba02faed | |||
b017fcd217 | |||
b3e636e36a | |||
57172a3609 | |||
87686bf4f7 | |||
29e00d6002 | |||
012cc74576 | |||
21b21ce73c | |||
4a7fbef176 | |||
a1ec0ba829 | |||
6d78af4d3a | |||
85428100c0 | |||
407cfcfb69 | |||
5e03c2c30d | |||
9c1d769ed8 | |||
7989b82c04 | |||
b0e982ba6f | |||
e83868695b | |||
b6e113fbef | |||
b88e26100f |
60
.github/workflows/publish-image.yaml
vendored
Normal file
60
.github/workflows/publish-image.yaml
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
name: Docker Image CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
# schedule:
|
||||||
|
# - cron: "0 10 * * *"
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- "**"
|
||||||
|
tags:
|
||||||
|
- "v*.*.*"
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
# list of Docker images to use as base name for tags
|
||||||
|
images: |
|
||||||
|
anaxios/holesail
|
||||||
|
# generate Docker tags based on the following events/attributes
|
||||||
|
tags: |
|
||||||
|
type=schedule
|
||||||
|
type=ref,event=branch
|
||||||
|
type=ref,event=pr
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=sha
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
|
# - name: Login to GHCR
|
||||||
|
# if: github.event_name != 'pull_request'
|
||||||
|
# uses: docker/login-action@v3
|
||||||
|
# with:
|
||||||
|
# registry: ghcr.io
|
||||||
|
# username: ${{ github.repository_owner }}
|
||||||
|
# password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
32
Dockerfile
32
Dockerfile
@@ -1,23 +1,23 @@
|
|||||||
FROM node:lts-slim AS base
|
FROM node:lts-slim AS base
|
||||||
|
|
||||||
WORKDIR /temp
|
|
||||||
COPY run.sh .
|
|
||||||
RUN chmod +x run.sh
|
|
||||||
|
|
||||||
RUN npm install -g holesail@1.10.1
|
RUN npm install -g holesail@1.10.1
|
||||||
|
|
||||||
ENV MODE server
|
FROM base AS dev
|
||||||
ENV HOST 0.0.0.0
|
|
||||||
ENV PORT 8989
|
|
||||||
ENV PUBLIC true
|
|
||||||
ENV USERNAME admin
|
|
||||||
ENV PASSWORD admin
|
|
||||||
ENV ROLE user
|
|
||||||
ENV CONNECTOR ""
|
|
||||||
ENV FORCE ""
|
|
||||||
|
|
||||||
#EXPOSE 8989
|
WORKDIR /
|
||||||
|
COPY run.sh .
|
||||||
|
COPY fetch-my-mc-connector.js .
|
||||||
|
RUN chmod +x run.sh
|
||||||
|
|
||||||
WORKDIR /data
|
ENV MODE=server
|
||||||
|
ENV HOST=0.0.0.0
|
||||||
|
ENV PORT=8989
|
||||||
|
ENV PUBLIC=true
|
||||||
|
ENV USERNAME=admin
|
||||||
|
ENV PASSWORD=admin
|
||||||
|
ENV ROLE=user
|
||||||
|
ENV KEY=""
|
||||||
|
ENV MY_MC_API_KEY=""
|
||||||
|
#ENV FORCE ""
|
||||||
|
|
||||||
ENTRYPOINT [ "/temp/run.sh" ]
|
CMD [ "/usr/bin/bash", "/run.sh" ]
|
||||||
|
17
README.md
17
README.md
@@ -17,7 +17,7 @@ The following environment variables are available:
|
|||||||
- HOST: The hostname or IP address to use for the client or server mode.
|
- HOST: The hostname or IP address to use for the client or server mode.
|
||||||
- PUBLIC: A boolean value indicating whether the server should use a public connetor string. Only applicable in server mode.
|
- PUBLIC: A boolean value indicating whether the server should use a public connetor string. Only applicable in server mode.
|
||||||
- FORCE: A boolean value indicating whether to force a short connector string of less than 32 chars. Only applicable in server and filemanager modes.
|
- FORCE: A boolean value indicating whether to force a short connector string of less than 32 chars. Only applicable in server and filemanager modes.
|
||||||
- CONNECTOR: A connector string used to identify the connection. Can be used in client, server, and filemanager modes.
|
- KEY: A string used to identify the connection. Can be used in client, server, and filemanager modes.
|
||||||
- USERNAME: The username to use for authentication in filemanager mode.
|
- USERNAME: The username to use for authentication in filemanager mode.
|
||||||
- PASSWORD: The password to use for authentication in filemanager mode.
|
- PASSWORD: The password to use for authentication in filemanager mode.
|
||||||
- ROLE: The role to assign to the user in filemanager mode. Can be either admin or user.
|
- ROLE: The role to assign to the user in filemanager mode. Can be either admin or user.
|
||||||
@@ -41,7 +41,7 @@ docker run -d --name holesail \
|
|||||||
-e MODE=server \
|
-e MODE=server \
|
||||||
-e PORT=25565 \
|
-e PORT=25565 \
|
||||||
-e HOST=minecraft \
|
-e HOST=minecraft \
|
||||||
-e CONNECTOR=very-super-secret \
|
-e KEY=very-super-secret \
|
||||||
-e PUBLIC=false \
|
-e PUBLIC=false \
|
||||||
--network holesail \
|
--network holesail \
|
||||||
anaxios/holesail:latest
|
anaxios/holesail:latest
|
||||||
@@ -66,7 +66,7 @@ services:
|
|||||||
PORT: 25565
|
PORT: 25565
|
||||||
HOST: minecraft
|
HOST: minecraft
|
||||||
PUBLIC: false
|
PUBLIC: false
|
||||||
CONNECTOR: very-super-secret
|
KEY: very-super-secret
|
||||||
networks:
|
networks:
|
||||||
- holesail
|
- holesail
|
||||||
|
|
||||||
@@ -101,18 +101,17 @@ services:
|
|||||||
holesail:
|
holesail:
|
||||||
container_name: holesail
|
container_name: holesail
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
network_mode: "host"
|
ports:
|
||||||
|
- 8989:8989
|
||||||
image: anaxios/holesail:latest
|
image: anaxios/holesail:latest
|
||||||
environment:
|
environment:
|
||||||
MODE: client
|
MODE: client
|
||||||
PORT: 8989
|
PORT: 8989
|
||||||
HOST: 0.0.0.0
|
HOST: 0.0.0.0
|
||||||
PUBLIC: false
|
PUBLIC: false
|
||||||
CONNECTOR: very-super-secret
|
KEY: very-super-secret
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note:** Client mode only works on Linux, and is incompatible with Windows and Mac.
|
|
||||||
|
|
||||||
### Filemanager Mode
|
### Filemanager Mode
|
||||||
|
|
||||||
In Filemanager mode, Holesail-docker serves a file manager interface. Example `docker-compose.yml` file:
|
In Filemanager mode, Holesail-docker serves a file manager interface. Example `docker-compose.yml` file:
|
||||||
@@ -131,7 +130,7 @@ services:
|
|||||||
ROLE: user
|
ROLE: user
|
||||||
USERNAME: admin
|
USERNAME: admin
|
||||||
PASSWORD: admin
|
PASSWORD: admin
|
||||||
CONNECTOR: very-super-secret
|
KEY: very-super-secret
|
||||||
volumes:
|
volumes:
|
||||||
- <host dir>:/data
|
- <host dir>:/data
|
||||||
```
|
```
|
||||||
@@ -153,7 +152,7 @@ services:
|
|||||||
PORT: 25565
|
PORT: 25565
|
||||||
HOST: minecraft
|
HOST: minecraft
|
||||||
PUBLIC: false
|
PUBLIC: false
|
||||||
CONNECTOR: very-super-secret
|
KEY: very-super-secret
|
||||||
networks:
|
networks:
|
||||||
- holesail
|
- holesail
|
||||||
|
|
||||||
|
17
fetch-my-mc-connector.js
Normal file
17
fetch-my-mc-connector.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
const apiKey = process.env.MY_MC_API_KEY;
|
||||||
|
|
||||||
|
const result = fetch('https://api.my-mc.link/my-hash',{
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json', 'Content-Type': 'application/json', 'x-my-mc-auth': apiKey}
|
||||||
|
})
|
||||||
|
.then(async response => {
|
||||||
|
const r = await response.json();
|
||||||
|
if (r.success == true) {
|
||||||
|
console.log(r.message);
|
||||||
|
} else {
|
||||||
|
throw new Error("failed to fetch holesail key");
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
throw Error(err);
|
||||||
|
})
|
51
run.sh
51
run.sh
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
#set -x
|
||||||
|
|
||||||
|
pid=0
|
||||||
|
|
||||||
CYAN="\033[1;96m"
|
CYAN="\033[1;96m"
|
||||||
RED="\033[0;91m"
|
RED="\033[0;91m"
|
||||||
GREEN="\033[0;92m"
|
GREEN="\033[0;92m"
|
||||||
@@ -21,20 +25,26 @@ success() {
|
|||||||
print "$GREEN" "$1"
|
print "$GREEN" "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#get_connector_my_mc() {
|
||||||
|
# KEY="$(/usr/local/bin/node /fetch-my-mc-connector.js)"
|
||||||
|
#}
|
||||||
|
|
||||||
cmd_argument_builder () {
|
cmd_argument_builder () {
|
||||||
local args="";
|
local args="";
|
||||||
case "$MODE" in
|
case "$MODE" in
|
||||||
"client")
|
"client")
|
||||||
[[ "$PORT" ]] && args="$args --port $PORT";
|
[[ "$PORT" ]] && args="$args --port $PORT";
|
||||||
[[ "$HOST" ]] && args="$args --host $HOST";
|
[[ "$HOST" ]] && args="$args --host $HOST";
|
||||||
[[ "$CONNECTOR" ]] && args="$args $CONNECTOR";
|
[[ "$KEY" ]] && args="$args $KEY";
|
||||||
|
#[[ "$UDP" = "true" ]] && args="$args --udp";
|
||||||
;;
|
;;
|
||||||
"server")
|
"server")
|
||||||
[[ "$PORT" ]] && args="$args --live $PORT";
|
[[ "$PORT" ]] && args="$args --live $PORT";
|
||||||
[[ "$HOST" ]] && args="$args --host $HOST";
|
[[ "$HOST" ]] && args="$args --host $HOST";
|
||||||
[[ "$PUBLIC" = "true" ]] && args="$args --public";
|
[[ "$PUBLIC" = "true" ]] && args="$args --public";
|
||||||
[[ "$FORCE" = "true" ]] && args="$args --force";
|
[[ "$FORCE" = "true" ]] && args="$args --force";
|
||||||
[[ "$CONNECTOR" ]] && args="$args --connector $CONNECTOR";
|
[[ "$KEY" ]] && args="$args --connector $KEY";
|
||||||
|
#[[ "$UDP" = "true" ]] && args="$args --udp";
|
||||||
;;
|
;;
|
||||||
"filemanager")
|
"filemanager")
|
||||||
args="--filemanager";
|
args="--filemanager";
|
||||||
@@ -45,13 +55,35 @@ cmd_argument_builder () {
|
|||||||
[[ "$PASSWORD" ]] && args="$args --password $PASSWORD";
|
[[ "$PASSWORD" ]] && args="$args --password $PASSWORD";
|
||||||
[[ "$ROLE" = "admin" ]] && args="$args --role admin";
|
[[ "$ROLE" = "admin" ]] && args="$args --role admin";
|
||||||
[[ "$ROLE" = "user" ]] && args="$args --role user";
|
[[ "$ROLE" = "user" ]] && args="$args --role user";
|
||||||
[[ "$CONNECTOR" ]] && args="$args --connector $CONNECTOR";
|
[[ "$KEY" ]] && args="$args --key $KEY";
|
||||||
|
#[[ "$UDP" = "true" ]] && args="$args --udp";
|
||||||
;;
|
;;
|
||||||
|
# "my-mc")
|
||||||
|
# #if ! get_connector_my_mc; then exit 1; fi
|
||||||
|
# [[ "$PORT" ]] && args="$args --port $PORT";
|
||||||
|
# [[ "$HOST" ]] && args="$args --host $HOST";
|
||||||
|
# [[ "$KEY" ]] && args="$args --connect $KEY";
|
||||||
|
# #[[ "$UDP" = "true" ]] && args="$args --udp";
|
||||||
|
# ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
printf "%s" "$args";
|
printf "%s" "$args";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# SIGUSR1-handler
|
||||||
|
my_handler() {
|
||||||
|
echo "my_handler"
|
||||||
|
}
|
||||||
|
|
||||||
|
term_handler() {
|
||||||
|
if [ $pid -ne 0 ]; then
|
||||||
|
kill -SIGTERM "$pid"
|
||||||
|
wait "$pid"
|
||||||
|
fi
|
||||||
|
exit 143; # 128 + 15 -- SIGTERM
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ARGS="$(cmd_argument_builder)"
|
ARGS="$(cmd_argument_builder)"
|
||||||
|
|
||||||
@@ -60,5 +92,16 @@ if [[ ! $ARGS ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
holesail $ARGS
|
# setup handlers
|
||||||
|
# on callback, kill the last background process, which is `tail -f /dev/null` and execute the specified handler
|
||||||
|
#trap 'kill ${!}; my_handler' SIGUSR1
|
||||||
|
trap 'kill ${!}; term_handler' SIGTERM SIGINT
|
||||||
|
|
||||||
|
# run application
|
||||||
|
/usr/local/bin/holesail $ARGS &
|
||||||
|
pid="$!"
|
||||||
|
|
||||||
|
# wait forever
|
||||||
|
while true; do
|
||||||
|
tail -f /dev/null & wait ${!}
|
||||||
|
done
|
||||||
|
Reference in New Issue
Block a user