Update Enigma BBS deployment
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled

This commit is contained in:
capitano
2026-04-07 16:35:44 +02:00
parent 6a39457989
commit 3089316a25
6 changed files with 197 additions and 77 deletions

View File

@@ -1,82 +1,70 @@
# Build stage FROM --platform=${BUILDPLATFORM:-linux/amd64} node:20-bookworm-slim
FROM --platform=${BUILDPLATFORM:-linux/amd64} node:20-bookworm-slim AS builder
ARG TARGETPLATFORM
ARG BUILDPLATFORM
ARG TARGETOS
ENV NVM_DIR /root/.nvm \
DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y \
git curl build-essential python3 libssl-dev \
lrzsz arj lhasa unrar-free p7zip-full dos2unix \
&& npm set progress=false && npm config set depth 0 \
&& npm install -g npm@latest pm2
WORKDIR /tmp
RUN git clone --depth 1 https://github.com/NuSkooler/enigma-bbs.git enigma-bbs-source \
&& cd enigma-bbs-source \
&& npm install --ignore-scripts \
&& dos2unix docker/bin/docker-entrypoint.sh \
&& dos2unix autoexec.sh
# Runtime stage
FROM node:20-bookworm-slim
ARG TARGETPLATFORM ARG TARGETPLATFORM
ARG BUILDPLATFORM ARG BUILDPLATFORM
ARG TARGETOS ARG TARGETOS
ARG TARGETBRANCH
LABEL maintainer="dave@force9.org" LABEL maintainer="dave@force9.org"
ENV NVM_DIR=/root/.nvm \ ENV NVM_DIR /root/.nvm
DEBIAN_FRONTEND=noninteractive \ ENV DEBIAN_FRONTEND noninteractive
PATH=/root/.npm-global/bin:/usr/local/bin:/usr/bin:/bin \
BBS_ROOT_DIR=/enigma-bbs \
BBS_STAGING_PATH=/enigma-bbs-pre
RUN apt-get update && apt-get install -y \
git curl \ # Install APT and NPM packages
lrzsz arj lhasa unrar-free p7zip-full \ RUN apt-get update \
&& apt-get install -y \
git \
curl \
build-essential \
python3 \
libssl-dev \
lrzsz \
arj \
lhasa \
unrar-free \
p7zip-full \
dos2unix \
&& npm set progress=false && npm config set depth 0 \
&& npm install -g npm@latest \
&& npm install -g pm2
COPY . /enigma-bbs/
WORKDIR /enigma-bbs
# Install npm dependencies
RUN cd /enigma-bbs && npm install
# Prepare files
RUN dos2unix /enigma-bbs/docker/bin/docker-entrypoint.sh \
&& apt-get remove dos2unix -y \ && apt-get remove dos2unix -y \
&& chmod +x /enigma-bbs/docker/bin/docker-entrypoint.sh \
&& cp -f /enigma-bbs/docker/bin/sexyz /usr/local/bin \
&& mkdir -p /enigma-bbs-pre/art \
&& mkdir /enigma-bbs-pre/mods \
&& mkdir /enigma-bbs-pre/config \
&& cp -rp /enigma-bbs/art/* ../enigma-bbs-pre/art/ \
&& cp -rp /enigma-bbs/mods/* ../enigma-bbs-pre/mods/ \
&& cp -rp /enigma-bbs/config/* ../enigma-bbs-pre/config/ \
&& apt-get remove build-essential python3 libssl-dev git curl dos2unix -y \
&& apt-get autoremove -y \ && apt-get autoremove -y \
&& npm set progress=false \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
&& npm install -g pm2 \ && apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /${BBS_ROOT_DIR} # enigma storage mounts
VOLUME /enigma-bbs/art
COPY --from=builder /tmp/enigma-bbs-source/ ${BBS_ROOT_DIR}/ VOLUME /enigma-bbs/config
COPY --from=builder /usr/local/bin/sexyz /usr/local/bin/ VOLUME /enigma-bbs/db
VOLUME /enigma-bbs/filebase
RUN dos2unix ${BBS_ROOT_DIR}/docker/bin/docker-entrypoint.sh \ VOLUME /enigma-bbs/logs
&& cp -f ${BBS_ROOT_DIR}/docker/bin/sexyz /usr/local/bin \ VOLUME /enigma-bbs/mods
&& mkdir -p ${BBS_STAGING_PATH}/art \ VOLUME /mail
&& mkdir -p ${BBS_STAGING_PATH}/mods \
&& mkdir -p ${BBS_STAGING_PATH}/config \
&& cp -rp ${BBS_ROOT_DIR}/art/* ${BBS_STAGING_PATH}/art/ \
&& cp -rp ${BBS_ROOT_DIR}/mods/* ${BBS_STAGING_PATH}/mods/ \
&& cp -rp ${BBS_ROOT_DIR}/config/* ${BBS_STAGING_PATH}/config/ \
&& rm -rf ${BBS_ROOT_DIR}/art/* \
&& rm -rf ${BBS_ROOT_DIR}/mods/* \
&& rm -rf ${BBS_ROOT_DIR}/config \
&& ln -s ${BBS_STAGING_PATH}/config ${BBS_ROOT_DIR}/config \
&& pm2 start ${BBS_ROOT_DIR}/main.js \
&& rm -rf ${BBS_STAGING_PATH}/config
VOLUME ${BBS_ROOT_DIR}/art \
${BBS_ROOT_DIR}/config \
${BBS_ROOT_DIR}/db \
${BBS_ROOT_DIR}/filebase \
${BBS_ROOT_DIR}/logs \
${BBS_ROOT_DIR}/mods \
/mail
# Enigma default port
EXPOSE 8888 44510 44511 EXPOSE 8888 44510 44511
WORKDIR ${BBS_ROOT_DIR} WORKDIR /enigma-bbs
ENTRYPOINT ["/enigma-bbs/docker/bin/docker-entrypoint.sh"] ENTRYPOINT ["/enigma-bbs/docker/bin/docker-entrypoint.sh"]

14
build-and-push.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
set -e
echo "Building Enigma BBS Docker image from git repo..."
cd /home/capitano/kubernetes/infrastructure/enigma
# Build the image
docker build -t git.giaco.net/enigma/enigmabbs:latest -f Dockerfile .
# Push to registry
echo "Pushing to git.giaco.net..."
docker push git.giaco.net/enigma/enigmabbs:latest
echo "Done! Image pushed to git.giaco.net/enigma/enigmabbs:latest"

View File

@@ -39,3 +39,4 @@ data:
requireSecureConnections: false requireSecureConnections: false
} }
} }
achievements.hjson: |

View File

@@ -13,9 +13,110 @@ spec:
labels: labels:
app: enigmabbs app: enigmabbs
spec: spec:
initContainers:
- name: init-check
image: busybox:latest
command: ["/bin/sh", "-c"]
args:
- |
echo "Checking for existing processes on port 8888..."
netstat -tlnp 2>/dev/null | grep 8888 || echo "Port 8888 is free"
- name: init-config
image: enigmabbs/enigma-bbs:latest
command: ["/bin/sh", "-c"]
args:
- |
set -e
echo "Creating directories..."
mkdir -p /enigma-bbs/config/security
mkdir -p /enigma-bbs/config/menus
mkdir -p /enigma-bbs/db
mkdir -p /enigma-bbs/filebase
echo "Copying SSH key from secret..."
cp /enigma-ssh-key/ssh_private_key.pem /enigma-bbs/config/security/ssh_private_key.pem
chmod 600 /enigma-bbs/config/security/ssh_private_key.pem
echo "Creating config.hjson..."
cat > /enigma-bbs/config/config.hjson << 'EOF'
{
system: {
bbsName: "Enigma BBS"
bbsTimeZone: "America/New_York"
bbsNodeNumber: 1
domain: "enigma.giaco.net"
}
loginServers: {
telnet: {
enabled: true
port: 8888
}
ssh: {
enabled: true
port: 44511
privateKeyPem: "/enigma-bbs/config/security/ssh_private_key.pem"
privateKeyPass: ""
}
}
contentServers: {
web: {
domain: "enigma.giaco.net"
http: {
enabled: true
port: 8888
}
}
}
security: {
secureLoginOnly: false
requireSecureConnections: false
}
}
EOF
echo "Creating achievements.hjson..."
cat > /enigma-bbs/config/achievements.hjson << 'EOF'
{
systemAchievements: {
}
}
EOF
echo "Creating menu.hjson..."
cat > /enigma-bbs/config/menu.hjson << 'EOF'
{
menus: {
someMenu: {
}
}
}
EOF
echo "Init completed"
volumeMounts:
- name: enigmabbs-config
mountPath: /enigma-bbs/config
- name: enigmabbs-data
mountPath: /enigma-bbs/db
- name: enigmabbs-art
mountPath: /enigma-bbs/art
- name: enigmabbs-mods
mountPath: /enigma-bbs/mods
- name: enigmabbs-ssh-key-volume
mountPath: /enigma-ssh-key
readOnly: true
containers: containers:
- name: enigmabbs - name: enigmabbs
image: git.giaco.net/enigma/enigmabbs:latest image: enigmabbs/enigma-bbs:latest
imagePullPolicy: Always
command: ["/bin/sh", "-c"]
args:
- |
set -e
echo "Killing any existing pm2 processes..."
pm2 delete all || true
pm2 kill || true
sleep 2
echo "Starting Enigma BBS..."
exec pm2-runtime main.js
ports: ports:
- containerPort: 8888 - containerPort: 8888
name: web name: web
@@ -31,7 +132,7 @@ spec:
mountPath: /enigma-bbs/db mountPath: /enigma-bbs/db
- name: enigmabbs-art - name: enigmabbs-art
mountPath: /enigma-bbs/art mountPath: /enigma-bbs/art
- name: enigmabbs-config-volume - name: enigmabbs-config
mountPath: /enigma-bbs/config mountPath: /enigma-bbs/config
- name: enigmabbs-mods - name: enigmabbs-mods
mountPath: /enigma-bbs/mods mountPath: /enigma-bbs/mods
@@ -47,15 +148,15 @@ spec:
readinessProbe: readinessProbe:
tcpSocket: tcpSocket:
port: 8888 port: 8888
initialDelaySeconds: 60 initialDelaySeconds: 90
periodSeconds: 10 periodSeconds: 10
timeoutSeconds: 5 timeoutSeconds: 5
failureThreshold: 3 failureThreshold: 5
livenessProbe: livenessProbe:
tcpSocket: tcpSocket:
port: 8888 port: 8888
initialDelaySeconds: 120 initialDelaySeconds: 180
periodSeconds: 20 periodSeconds: 30
timeoutSeconds: 10 timeoutSeconds: 10
failureThreshold: 3 failureThreshold: 3
volumes: volumes:
@@ -65,12 +166,13 @@ spec:
- name: enigmabbs-art - name: enigmabbs-art
persistentVolumeClaim: persistentVolumeClaim:
claimName: enigmabbs-art claimName: enigmabbs-art
- name: enigmabbs-config-volume - name: enigmabbs-config
configMap: emptyDir: {}
name: enigmabbs-config - name: enigmabbs-ssh-key-volume
secret:
secretName: enigmabbs-ssh-key
- name: enigmabbs-mods - name: enigmabbs-mods
persistentVolumeClaim: persistentVolumeClaim:
claimName: enigmabbs-mods claimName: enigmabbs-mods
- name: enigmabbs-logs - name: enigmabbs-logs
persistentVolumeClaim: emptyDir: {}
claimName: enigmabbs-logs

8
registry-secret.yaml Normal file
View File

@@ -0,0 +1,8 @@
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJnaXQuZ2lhY28ubmV0Ijp7InVzZXJuYW1lIjoiY2FwaXRhbm8iLCJwYXNzd29yZCI6ImE1ZTQ4NTJmOWU5ODI3OGM4MjhlNzA5YjdmOTcxYmE0NmQ0YWY5NjAiLCJlbWFpbCI6ImFkbWluQGdpYWNvLm5ldCIsImF1dGgiOiJZMkZ3YVhSaGJtODZZVFZsTkRnMU1tWTVaVGs0TWpjNFl6Z3lPR1UzTURsaU4yWTVOekZpWVRRMlpEUmhaamsyTUE9PSJ9fX0=
kind: Secret
metadata:
name: git-registry-secret
namespace: enigmabbs
type: kubernetes.io/dockerconfigjson

7
ssh-secret.yaml Normal file
View File

@@ -0,0 +1,7 @@
apiVersion: v1
data:
ssh_private_key.pem: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlHNHdJQkFBS0NBWUVBcWlBTmlqVnAzd2ZNblAxYld3WTRmb2Q1MFZza3VERDNlLzVuNVJUSExNNkZmd1pZCkNFeHlzUFNnSUNFaUpSajhLekVGcTJzZ3VoQUduRkIrb3VlTkFqVjlaSHlPZEtLeDZjb3N3Zk5DelZqdnJ0K1UKNFVzS0tyYVpVS3NWSmh2SUZodGhEUlJ1VHV5Y3NnOXpHYlV0VmFIYm1kNTFHNk93dUpvdG9KdTJ0Z3hyMEZXMgpWV3N1V2ZhcGlTRHhDWTRkeVg1V0JCbVhBNE9oc2wxYnBlN1JlUFBKS1hGbUNzYnkwV3NjMlI5ZjYxSU4xTllqClRxRnBDY0REbEtMN3B6VGMrVDY1UlA4bkNlRlJSaTI4MCtHRis3MG1ZbnFreGNwV1hHSEFIcHBvdHJRRDR1UHgKdUt3c3Y0SEV3VnZnZE9WeFVkUng1Z25HR0g1NlFjQ1hqbE1MaW5tSVlkdkhzUEJwU0R1NVVRTmJGY2FETklKdgpmTHpkcFZUN1g5cFRwd1QxTW9pZGZUQTJSZEJvNXI4alR4VDZ0czNva0ZUNWpCbUdZL2J2VUJzcFp4V1V5QVdkCndPa1lidGRvSkFoeXdYS2V1aXhiZU05RWpWc0twUGNKeUpsengrZUt5YTBuS0tuR1BNakJ5cXphWnBPVE9FR3EKUHYzeXlGN1E5V1pZU20yWEFnTUJBQUVDZ2dHQUJKbVJSQ2Rsa1c0NGpoWWJuajV3MEpzQkpEUCtyaXhFeE1tQQpMYVYrTFN2NFdCTG4xbkdhdUVZay9qbG5IdkdwLzlEM2drY0hQNENuYlJxUUVmK0l4SUtGdlczUXZENlo2T1JhCmlYUDJYbThGTEFsSGtUL2lLbjE5Yjd6d2VYTk8yYW9yMlpxdjBOcDg4aU9RelNVazhLZkx0RUZia1QrL3kzMy8KdGRRQUFMUWRSaWpMSVV3Z21MWWVwMktJb2VXQjBLemx6bjZTb3Jtd2FZNDBxQ3ZvNWdoUmJCbHcxT0hFTnYxYQpibFIyMTNvRWZiaThnNmZCbTAzbSsrSGNSQTBkMFJBYlRhekNCZnBqdXZUaTNrYjArZUR2WWFqMFRJUVZwbExXCmg5clE4b0IwN2FEbjFvWmIwTVAwdURHdnhZV0d2N2xxeFRSTDl5T2RTQVdEdzcxQnh4VWtFQ1QreWdNQngxZFQKazd3d0NCSXY4YUhLeGIzZDlEN0FmSVd5ZDVZUm9yZFlhNXlqMUJScExjaDZmYWxwMjFHa05QUzBpaGRqTDBhZQpEWWc3cG9PYVkvM1hkRDNXWkJNRTdRbE9RbHdiLzFhelhWRUs1VXMvQXFwUEhnNi9nekcyQ1RhZVlBSUxRblBrCkZkbUJWREtqM1B0SEx4M2ZvOFg1WUJHS1FEOWhBb0hCQU93L2xDRnpWVUcxQktsMU8zZ2hxbUx2N1VpN1R2bGsKWG05V2dpVjNhYkxRTjcvb1VUUmNVR1M2SG84UDRpVzNJYmRLVHpHYnU5WXRSRHhoSmlMRWk0Z0dUV2V5bjFYcgpoMFJZajJyNTlKeUEvOS94YUVyTVFxa3I0WG9ETUxKUnpKRDhTZjBBQmVUdnZ2dlpZYkVpZk1rTVpxSGRERUtGCnMwTEdZVU1hSS8zdHJqQ0FRNkIyNVBvcHdBeGkxNXpESmU2WnZLZ2NSaThpMDduZW0rQndOcHJRMU5oNWZZS1YKSVpvWFFVWlpwaEhxOGVJeGtXUHhma2NwMC9FMHU2N08xUUtCd1FDNFdUMjY4UDNpSGk3eUtGbWJEV2ErcWw1SgpxYXV3bXRJRUZxMGRXVE5wWkw4ZlFDN0IwOXRUVE95dENZclpHek92VWJpVEREV3VjTzcrbkxxaEp0YzRXVmxyClJhQ3ltTm1WN2t5MDgzbUJub0VMZ01vQjRqUFJTNnNNMGhUbXdObnRHOFBDZmJTYnlWM21DUGVnMmJaMGVWZGYKQmQ1dnVsdXp0ZHBQSVRZaUwwaFAxSm40WXN1OVNZb0k0S2EveXQ2VTNNYXZzNHAwY29sSFhZUmtJcWZOaitNcwpEUUViVkZERmZTQldjVjlzN3g5ZVJ2aTU5UEVXcE81R09vWFArTHNDZ2NFQTRDUEtCSnFKenRkUlh2ME11UU1uCnhzcGZVOXZ5SjRia1dibTNySmhJdmcveWRLNlRMSnhRNGQvN1VqdjlrVTdZUEMvU1J2eThENDNPNllJNlRrNHYKRzVUdkoyMCs0cU9kS0dqbFdOZGhEb01OUUlpbkxCL3pOdEdkRU1lcUVlU3RzdmpKc2JHdDVmRFlQOVdVYkJ5TwpTNmpxVHJPTUNDa1ZWRXNteUNVcTlLWGwxN281YnlxZVFBSVFaUy81NUk3NWxCQmoveE1rTzJCTmhGRUJqc1NuCjZlWXJxbDVKaC9TNWRwcU5vWk00amxOYnZnRE5NZ2RTaVczVDJVcndyZjhwQW9IQVlsbWFDV1lRek5YMWpkUGgKR2t1b0NRaXpqUEVzVytmOUs1azllbTdnY3RZQThSYzQyc2ZBTjB6TzUvSXpWV2loeG1MKzZkU1Z2eDhaSWxWVApiQzVnbS90dkxUL1VYL1FVQVYxRkp6VE9HazBKNDYwdUdKc3BzZnVBb2pKaVhFbCsrblRabDZXZytZd1F3RzBBClQ1eFhMd1NkakdDQkwzSnBBaE4vQ01CYk5SbXNwb3B5S29YcTFHMnJhdGtQblRzS1RMa01keWgrTVduNXUwMDEKR0ljMHB3S2czQnVELzZTWUF3U2lmL3UwUVZYQmtuYWlzL0x0dkhyNWRCWTgxWnVKQW9IQWVDYkhISHRKUzRkawp0NS9hMVY5ZkZuU1IrS2RONldwTG1mSG1aZW9zRnE5Z3U4eUdFTU1aWlp2dEZkOUtZa2ZMcDQ3SVNxdmNDYVJDClZNNEZFcjZOOFd2dWdKbFNnVDJMcHFxSktJUjF2WVk3MFZSZlBTQjdwMEYydlFnRnZta3FhcUZwR2NvaG15UkwKK1Q5bkd0UzhTZGdGNTJZenNYbjBWMHM2Z1piN0VsWitrc29vVldnMFgrcVNyMitjcWFkSndReFVyQVovcUlQRApJQ3QyK0FOMkxYSDl5Zko5Y1lhM0ZpSytET3IrK0d1U0hWdHpkQno3dGJQQm5kMWpEWmxPCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
kind: Secret
metadata:
name: enigmabbs-ssh-key
namespace: enigmabbs