This commit is contained in:
iceBear67
2026-07-05 13:49:09 +08:00
parent a37aece686
commit bf67b8b95f
21 changed files with 230 additions and 61 deletions

31
.env Normal file
View File

@@ -0,0 +1,31 @@
#:CONFIGURATION FILE FOR BEARCLOUD
#:WARNING: DO NOT EDIT FILEPATH COMMENTS WITHOUT CONSENT OF substitution.sh
# /etc/hostname
CLOUD_HOSTNAME=localhost
# /etc/network/interfaces
CLOUD_GATEWAY_ADDRESS=10.0.0.119
# /root/.ssh/authorized_keys
HOST_SSH_PUBLIC_KEY=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6GbswtvLbhmju/vBunpfPaqpcIuESJSLoR+Sz0ujTs cardno:F1D0_013135A1
# /etc/ssh/sshd_config.d/09-adjust-ssh-port.conf
HOST_SSH_PORT=2222
# /daemon/config.yaml
BUBBLE_SSH_PORT=22
# /etc/init.d/auth-server
BUBBLE_AUTH_ORG=cloud
BUBBLE_AUTH_TEAM=workspace
BUBBLE_AUTH_GITEA_URL=https://git.sfclub.cc
# /etc/conf.d/auth-server
BUBBLE_AUTH_GITEA_KEY=sk-xxxxxxxx
# /usr/bin/tsdns
TS_AUTHKEY=
HOMELAB_TLD=ice
HOMELAB_ZONE=cloud
ADVERTISE_ROUTE=10.1.0.0/24
TSDNS_SUBNET=10.1.0.0/24

31
.env.example Normal file
View File

@@ -0,0 +1,31 @@
#:CONFIGURATION FILE FOR BEARCLOUD
#:WARNING: DO NOT EDIT FILEPATH COMMENTS WITHOUT CONSENT OF substitution.sh
# /etc/hostname
CLOUD_HOSTNAME=localhost
# /etc/network/interfaces
CLOUD_GATEWAY_ADDRESS=10.0.0.119
# /root/.ssh/authorized_keys
HOST_SSH_PUBLIC_KEY=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6GbswtvLbhmju/vBunpfPaqpcIuESJSLoR+Sz0ujTs cardno:F1D0_013135A1
# /etc/ssh/sshd_config.d/09-adjust-ssh-port.conf
HOST_SSH_PORT=2222
# /daemon/config.yaml
BUBBLE_SSH_PORT=22
# /etc/init.d/auth-server
BUBBLE_AUTH_ORG=cloud
BUBBLE_AUTH_TEAM=workspace
BUBBLE_AUTH_GITEA_URL=https://git.sfclub.cc
# /etc/conf.d/auth-server
BUBBLE_AUTH_GITEA_KEY=sk-xxxxxxxx
# /usr/bin/tsdns
TS_AUTHKEY=
HOMELAB_TLD=ice
HOMELAB_ZONE=cloud
ADVERTISE_ROUTE=10.1.0.0/24
TSDNS_SUBNET=10.1.0.0/24

View File

@@ -2,8 +2,6 @@
set -eo pipefail
hasunset=0
if [ "$UID" != "0" ]; then
echo "This script must be run in root."
exit 2
@@ -16,29 +14,11 @@ fi
PATH="$PWD/scripts:$PATH"
if [[ "$CLOUD_CONFIG_REPO" -eq "" ]]; then
echo "CLOUD_CONFIG_REPO is not set."
CLOUD_CONFIG_REPO="https://git.sfclub.cc/cloud/bearnet"
hasunset=1
fi
validate.sh
if [[ "$CLOUD_CONFIG_REVISION" -eq "" ]]; then
echo "CLOUD_CONFIG_REVISION is not set."
CLOUD_CONFIG_REVISION="wish"
hasunset=1
fi
if [[ "$CLOUD_GATEWAY_ADDRESS" -eq "" ]]; then
echo "CLOUD_GATEWAY_ADDRESS is not set."
CLOUD_GATEWAY_ADDRESS="10.0.0.119"
hasunset=1
fi
if [[ "$hasunset" -ne 0 ]]; then
echo ""
echo "Default values will be used for unset environments:"
echo ""
set | grep -E "^CLOUD_"
if [[ "$?" != "0" ]]; then
echo "env validation failed"
exit 1
fi
IMAGE_TAG=$(git rev-parse --short HEAD)

View File

@@ -31,7 +31,7 @@ alpine-make-vm-image \
--fs-skel-dir "$OVERLAY_DIR" \
--fs-skel-chown root:root \
--script-chroot \
--packages "git curl docker cronie openssh" \
--packages "curl docker openssh" \
"$IMAGE_FILE" \
"$CONFIGURE_SH" | tee $TMP

View File

@@ -31,7 +31,6 @@ rc-update add net.lo boot
rc-update add net.eth0 default
rc-update add acpid default
rc-update add docker default
rc-update add cronie default
rc-update add sshd
rc-update add auth-server
rc-update add bubble
@@ -48,12 +47,5 @@ rm -rf \
/usr/share/doc \
/usr/share/info
step 'Setup git user'
git config --global user.email bearnet+keeper@sab.ee
git config --global user.name "B.B.K.K.B.K.K"
adduser -S keeper
mkdir /users
chown keeper /users
echo ''
echo '=== Configure script completed ==='

View File

@@ -0,0 +1,14 @@
address: ":_BUBBLE_SSH_PORT_"
network-group: "workspace"
server-key-file: "/etc/ssh/ssh_host_rsa_key"
workspace-parent: "/data/workspace"
global-share-dir: "/data/share"
auth-server: "http://localhost:8080/"
manager:
address: "0.0.0.0:7684"
templates:
".*":
image: ""

View File

@@ -1,15 +0,0 @@
#!/bin/sh
# VARIABLES: _REVISION_ _REPO_
set -euo pipefail
mkdir -p /users && chown keeper /users && chmod 644 /users
init_repo(){
su - keeper 'git clone -b _REVISION_ _REPO_ /users'
}
if [[ ! -d /users/.git ]]; then
init_repo
elif [[ -d /users && cd /users && ! su - keeper 'git pull origin _REVISION_' ]]; then
init_repo
fi

View File

@@ -0,0 +1 @@
GITEA_TOKEN=_BUBBLE_AUTH_GITEA_KEY_

View File

@@ -0,0 +1 @@
_CLOUD_HOSTNAME_

View File

@@ -1,7 +1,7 @@
#!/sbin/openrc-run
command="/usr/bin/auth-server"
command_background=true
command_args="-addr 0.0.0.0:8080 -root /users"
command_args="-org _BUBBLE_AUTH_ORG_ -team _BUBBLE_AUTH_TEAM_ -gitea-url _BUBBLE_AUTH_GITEA_URL_"
command_user="keeper"
pidfile="/run/${RC_SVCNAME}.pid"

9
image/overlay/etc/init.d/tsdns Executable file
View File

@@ -0,0 +1,9 @@
#!/sbin/openrc-run
depend() {
need docker net
}
command="/usr/bin/tsdns"
command_background=true
pidfile="/run/${RC_SVCNAME}.pid"

View File

@@ -0,0 +1,7 @@
#!/sbin/openrc-run
depend() {
need docker net
}
command="/usr/bin/update-images"

View File

@@ -3,4 +3,4 @@ iface lo inet loopback
auto eth0
iface eth0 inet dhcp
post-up ip route del default || true; ip route add default via GATEWAY_ADDRESS
post-up ip route del default || true; ip route add default via _CLOUD_GATEWAY_ADDRESS_

View File

@@ -0,0 +1 @@
Port _HOST_SSH_PORT_

View File

@@ -1 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6GbswtvLbhmju/vBunpfPaqpcIuESJSLoR+Sz0ujTs cardno:F1D0_013135A1
_HOST_SSH_PUBLIC_KEY_

23
image/overlay/usr/bin/tsdns Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/sh
if [ ! docker network insepct "workspace" ]; then
docker network create \
--attachable \
--ipv4 \
--ip-range "_ADVERTISE_ROUTE_" \
--subnet "_TSDNS_SUBNET_" \
workspace
fi
docker run -e "TS_AUTHKEY=_TS_AUTHKEY_" \
-e "HOMELAB_TLD=_HOMELAB_TLD_" \
-e "HOMELAB_ZONE=_HOMELAB_ZONE_" \
-e "TS_STATE_DIR=/tstate" \
-e "ADVERTISE_ROUTE=_ADVERTISE_ROUTE_" \
-e "TS_DEBUG_OMIT_LOCAL_ADDRS=true" \
--network "workspace" \
-p 41641:41641/udp
-v "/data/tsdns:/tstate"
--restart unless-stopped
ghcr.io/saltedfishclub/tsdns:latest

View File

@@ -0,0 +1,10 @@
#!/bin/sh
cleanup_() {
touch /.image-update-flag
}
if [ ! -f /.image-update-flag ]; then
docker pull
fi

View File

@@ -1,2 +0,0 @@
# min hour day month weekday command
*/15 * * * * /usr/bin/sh /daemon/update-keys.sh

32
image/substitution.sh Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/sh
current_file=""
root="/kitchen/overlay"
while IFS= read -r line; do
case "$line" in
\#\ /*)
current_file="${line#\# }"
;;
\#\:*)
continue
;;
*=*)
if [ -z "$current_file" ]; then
echo "warning: value without file: $line" >&2
continue
fi
key="${line%%=*}"
value="${line#*=}"
key_esc=$(printf '%s' "$key" | sed 's/[]\/$*.^[]/\\&/g')
value_esc=$(printf '%s' "$value" | sed 's/[\/&]/\\&/g')
sed -i "s/_${key_esc}_/${value_esc}/g" "$root$current_file"
;;
"")
continue
;;
*)
echo "unknown line: $line" >&2
;;
esac
done

58
scripts/validate.sh Executable file
View File

@@ -0,0 +1,58 @@
#!/bin/sh
root="$PWD/image/overlay"
env_file="${1:-.env}"
if [ ! -f "$env_file" ]; then
echo "cannot find $env_file"
exit 1
fi
current_file=""
fail=0
while IFS= read -r line; do
case "$line" in
\#\ /*)
current_file="${line#\# }"
target="$root$current_file"
if [ ! -f "$target" ]; then
echo "missing file: $target" >&2
fail=1
current_file=""
fi
;;
\#\:*)
continue
;;
*=*)
if [ -z "$current_file" ]; then
echo "warning: value without file: $line" >&2
continue
fi
key="${line%%=*}"
target="$root$current_file"
if ! grep -q "_${key}_" "$target"; then
echo "missing variable: _${key}_ in $target" >&2
fail=1
fi
;;
"")
continue
;;
*)
echo "unknown line: $line" >&2
fail=1
;;
esac
done < "$env_file"
exit "$fail"

View File

@@ -3,22 +3,18 @@ FROM golang:1.25-alpine AS bubble-builder
WORKDIR /src
RUN apk add git && git clone https://github.com/iceBear67/bubble . && go mod download && mkdir /build
RUN CGO_ENABLED=0 go build -o /build/daemon . && \
CGO_ENABLED=0 go build -o /build/auth_server ./util/
CGO_ENABLED=0 go build -o /build/auth_server ./gitea-auth/
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH \
go build -o /build/daemon . && \
CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH \
go build -o /build/auth_server ./util/
go build -o /build/auth_server ./gitea-auth/
FROM alpine:3.24 AS rootfs-builder
ENV CLOUD_CONFIG_REPO="https://git.sfclub.cc/cloud/bearnet"
ENV CLOUD_CONFIG_REVISION="wish"
ENV CLOUD_GATEWAY_ADDRESS="10.0.0.119"
RUN apk update && apk add alpine-make-vm-image
COPY ./image /kitchen
RUN sed -i "s#_REPO_#$CLOUD_CONFIG_REPO#g" /kitchen/overlay/daemon/update-keys.sh && \
sed -i "s#_REVISION_#$CLOUD_CONFIG_REVISION#g" /kitchen/overlay/daemon/update-keys.sh && \
sed -i "s#GATEWAY_ADDRESS#$CLOUD_GATEWAY_ADDRESS#g" /kitchen/overlay/etc/network/interfaces
COPY .env /kitchen/.env
RUN sh /kitchen/substitution.sh < /kitchen/.env
COPY --from=bubble-builder --chmod=755 /build/daemon /kitchen/overlay/usr/bin/bubble
COPY --from=bubble-builder --chmod=755 /build/auth_server /kitchen/overlay/usr/bin/auth-server
COPY ./secret/* /kitchen/overlay/etc/ssh/