Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
FROM public.ecr.aws/docker/library/node:24.11.0-bullseye

# Install development tools
# cmake, ninja-build, g++ for C++ core compilation
# git, openssh-client for git operations
# gdb for debugging
RUN apt-get update && \
apt-get install -y --no-install-recommends \
cmake \
ninja-build \
g++ \
git \
openssh-client \
gdb \
curl \
wget \
ca-certificates \
zip \
unzip \
tar \
pkg-config \
# Optional: zsh/oh-my-zsh for better shell experience?
&& rm -rf /var/lib/apt/lists/*

# Install vcpkg dependencies (linux-libc-dev, etc if needed)
# Reusing the list from the main dockerfile to be safe
RUN apt-get update && \
apt-get install -y --no-install-recommends \
autoconf \
m4 \
automake \
libtool \
linux-libc-dev \
&& rm -rf /var/lib/apt/lists/*

USER node
23 changes: 23 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "Evolution Server Dev",
"dockerComposeFile": [
"docker-compose.dev.yml"
],
"service": "app",
"workspaceFolder": "/workspace",
"customizations": {
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"ms-vscode.cmake-tools",
"ms-vscode.cpptools",
"donjayamanne.githistory",
"mhutchie.git-graph"
],
"settings": {
"terminal.integrated.defaultProfile.linux": "bash"
}
}
}
}
15 changes: 15 additions & 0 deletions .devcontainer/docker-compose.dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
version: '3.8'

services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ../:/workspace:cached
command: /bin/sh -c "while sleep 1000; do :; done"
ports:
- "4000:4000"
- "7911:7911"
- "7922:7922"
- "7711:7711"
164 changes: 47 additions & 117 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,80 +1,4 @@
# Stage 1: Build CoreIntegrator
FROM public.ecr.aws/docker/library/node:24.11.0-bullseye-slim AS core-integrator-builder

# Install required dependencies
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
wget tar git autoconf ca-certificates g++ \
m4 automake libtool pkg-config make tzdata \
cmake ninja-build unzip zip curl linux-libc-dev && \
rm -rf /var/lib/apt/lists/*

WORKDIR /repositories

# Clone required repositories
RUN git clone --depth 1 --branch master https://github.com/ProjectIgnis/CardScripts.git scripts && \
git clone --depth 1 --branch master https://github.com/ProjectIgnis/BabelCDB.git databases && \
git clone --depth 1 --branch master https://github.com/ProjectIgnis/LFLists banlists-project-ignis && \
git clone --depth 1 --branch master https://github.com/mycard/ygopro-scripts.git mercury-scripts && \
git clone --depth 1 --branch master https://github.com/evolutionygo/pre-release-database-cdb mercury-prerelases && \
git clone --depth 1 --branch main https://github.com/evolutionygo/cards-art-server mercury-arts && \
git clone --depth 1 --branch main https://github.com/termitaklk/lflist banlists-evolution && \
git clone --depth 1 --branch main https://github.com/evolutionygo/server-formats-cdb.git alternatives && \
wget -O mercury-lflist.conf https://raw.githubusercontent.com/termitaklk/koishi-Iflist/main/lflist.conf && \
wget -O mercury-cards.cdb https://github.com/purerosefallen/ygopro/raw/server/cards.cdb

# Prepare banlists and pre-releases folder
RUN mkdir banlists mercury-pre-releases-cdbs && \
mv banlists-project-ignis/* banlists/ && \
mv banlists-evolution/* banlists/ && \
find mercury-prerelases mercury-arts -name "*.cdb" -exec cp {} mercury-pre-releases-cdbs/ \;

# Copy binary and setup directories
COPY ./mercury/ygopro .

# Copy scripts and binaries into each alternative directory
RUN for dir in ./alternatives/*/; do \
echo "$dir/script"; \
cp -r ./mercury-scripts/* "$dir/script"; \
cp ygopro "$dir"; \
done

# Copy selected banlists into corresponding alternative folders
RUN bash -c 'set -e; \
declare -A MAP=( \
["2010.03 Edison(Pre Errata)"]="edison" \
["2014.04 HAT (Pre Errata)"]="hat" \
["jtp-oficial"]="jtp" \
["GOAT"]="goat" \
["Rush"]="rush" \
["Speed"]="speed" \
["Tengu.Plant"]="tengu" \
["World"]="world" \
["MD.2025.03"]="md" \
["Genesys"]="genesys" \
); \
for name in "${!MAP[@]}"; do \
cp "./banlists/${name}.lflist.conf" "./alternatives/${MAP[$name]}/lflist.conf"; \
done'

WORKDIR /app

# Clone and bootstrap Vcpkg
RUN git clone https://github.com/microsoft/vcpkg.git && \
./vcpkg/bootstrap-vcpkg.sh

# Copy CoreIntegrator source
COPY ./core .

# Install dependencies and build the application
# Note: we disable the internal vcpkg build of the build script to rely on the docker environment's vcpkg if needed,
# but the build script effectively does the same. ideally we can just run the cmake commands directly here
# to avoid re-cloning vcpkg or issues with the script's path logic.
RUN ./vcpkg/vcpkg install --triplet x64-linux && \
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=./vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release && \
cmake --build build

# Stage 2: Build Node.js server
# Stage 1: Build Node.js server
FROM public.ecr.aws/docker/library/node:24.11.0-bullseye AS server-builder

ENV USER=node
Expand All @@ -90,15 +14,18 @@ RUN git clone --depth 1 https://github.com/diangogav/evolution-types.git ./src/e

# Copy server source and build
COPY . .
COPY --from=core-integrator-builder /repositories/mercury-pre-releases-cdbs ./databases/mercury-pre-releases
COPY --from=core-integrator-builder /repositories/mercury-cards.cdb ./databases/mercury-pre-releases

# Copy assets from the base image (pre-built)
# This assumes you have built 'evolution-core:latest' previously
COPY --from=evolution-core:latest /repositories/mercury-pre-releases-cdbs ./databases/mercury-pre-releases
COPY --from=evolution-core:latest /repositories/mercury-cards.cdb ./databases/mercury-pre-releases

RUN npm run generate-mercury-pre-releases-cdb && \
npm run build && \
npm prune --production


# Stage 3: Final image
# Stage 2: Final image
FROM public.ecr.aws/docker/library/node:24.11.0-slim

# Install runtime dependencies
Expand All @@ -114,44 +41,47 @@ COPY --from=server-builder /server/package.json ./package.json
COPY --from=server-builder /server/node_modules ./node_modules
COPY --from=server-builder /server/mercury ./mercury

# CoreIntegrator binaries
COPY --from=core-integrator-builder /app/libocgcore.so ./core/libocgcore.so
COPY --from=core-integrator-builder /app/CoreIntegrator ./core/CoreIntegrator

# Evolution Resources
COPY --from=core-integrator-builder /repositories/scripts ./scripts/evolution/
COPY --from=core-integrator-builder /repositories/databases ./databases/evolution/
COPY --from=core-integrator-builder /repositories/mercury-pre-releases-cdbs ./databases/mercury-pre-releases
COPY --from=core-integrator-builder /repositories/mercury-cards.cdb ./databases/mercury-pre-releases
COPY --from=core-integrator-builder /repositories/banlists ./banlists/evolution/

# Mercury
COPY --from=core-integrator-builder /repositories/mercury-scripts ./mercury/script
COPY --from=core-integrator-builder /repositories/mercury-lflist.conf ./mercury/lflist.conf
COPY --from=core-integrator-builder /repositories/mercury-cards.cdb ./mercury/cards.cdb
COPY --from=core-integrator-builder /repositories/mercury-cards.cdb ./mercury/alternatives/md/cards.cdb
COPY --from=core-integrator-builder /repositories/mercury-cards.cdb ./mercury/alternatives/genesys/cards.cdb

# Mercury Pre-releases
COPY --from=core-integrator-builder /repositories/mercury-scripts ./mercury/pre-releases/tcg/script
COPY --from=core-integrator-builder /repositories/mercury-lflist.conf ./mercury/pre-releases/tcg/lflist.conf
COPY --from=core-integrator-builder /repositories/mercury-prerelases/script/ ./mercury/pre-releases/tcg/script/
COPY --from=core-integrator-builder /repositories/mercury-arts/script/ ./mercury/pre-releases/tcg/script/

COPY --from=core-integrator-builder /repositories/mercury-scripts ./mercury/pre-releases/ocg/script
# CoreIntegrator binaries (From Base Image)
COPY --from=evolution-core:latest /app/libocgcore.so ./core/libocgcore.so
COPY --from=evolution-core:latest /app/CoreIntegrator ./core/CoreIntegrator

# Evolution Resources (From Base Image)
COPY --from=evolution-core:latest /repositories/scripts ./scripts/evolution/
COPY --from=evolution-core:latest /repositories/databases ./databases/evolution/
COPY --from=evolution-core:latest /repositories/mercury-pre-releases-cdbs ./databases/mercury-pre-releases
COPY --from=evolution-core:latest /repositories/mercury-cards.cdb ./databases/mercury-pre-releases
COPY --from=evolution-core:latest /repositories/banlists ./banlists/evolution/

# Mercury (From Base Image)
COPY --from=evolution-core:latest /repositories/script ./mercury/script
COPY --from=evolution-core:latest /repositories/mercury-lflist.conf ./mercury/lflist.conf
COPY --from=evolution-core:latest /repositories/mercury-cards.cdb ./mercury/cards.cdb
COPY --from=evolution-core:latest /repositories/mercury-cards.cdb ./mercury/alternatives/md/cards.cdb
COPY --from=evolution-core:latest /repositories/mercury-cards.cdb ./mercury/alternatives/genesys/cards.cdb

# Mercury Pre-releases (From Base Image)
# We use physical copies here because we merge extra scripts into them,
# and we don't want to pollute the main script folder.
COPY --from=evolution-core:latest /repositories/script ./mercury/pre-releases/tcg/script
COPY --from=evolution-core:latest /repositories/mercury-lflist.conf ./mercury/pre-releases/tcg/lflist.conf
COPY --from=evolution-core:latest /repositories/mercury-prerelases/script/ ./mercury/pre-releases/tcg/script/
COPY --from=evolution-core:latest /repositories/mercury-arts/script/ ./mercury/pre-releases/tcg/script/

COPY --from=evolution-core:latest /repositories/script ./mercury/pre-releases/ocg/script
COPY --from=server-builder /server/mercury/pre-releases/tcg/cards.cdb ./mercury/pre-releases/ocg/cards.cdb
COPY --from=core-integrator-builder /repositories/banlists/OCG.lflist.conf ./mercury/pre-releases/ocg/lflist.conf
COPY --from=core-integrator-builder /repositories/mercury-prerelases/script/ ./mercury/pre-releases/ocg/script/
COPY --from=core-integrator-builder /repositories/mercury-arts/script/ ./mercury/pre-releases/ocg/script/

# Mercury OCG
COPY --from=core-integrator-builder /repositories/mercury-scripts ./mercury/ocg/script
COPY --from=core-integrator-builder /repositories/banlists/OCG.lflist.conf ./mercury/ocg/lflist.conf
COPY --from=core-integrator-builder /repositories/mercury-cards.cdb ./mercury/ocg/cards.cdb
COPY --from=core-integrator-builder /repositories/ygopro ./mercury/ocg/ygopro

# Mercury Alternatives
COPY --from=core-integrator-builder /repositories/alternatives ./mercury/alternatives/
COPY --from=evolution-core:latest /repositories/banlists/OCG.lflist.conf ./mercury/pre-releases/ocg/lflist.conf
COPY --from=evolution-core:latest /repositories/mercury-prerelases/script/ ./mercury/pre-releases/ocg/script/
COPY --from=evolution-core:latest /repositories/mercury-arts/script/ ./mercury/pre-releases/ocg/script/

# Mercury OCG (From Base Image)
# OCG is identical to main script, so we use a symlink to save space.
RUN mkdir -p ./mercury/ocg && ln -s ../script ./mercury/ocg/script
COPY --from=evolution-core:latest /repositories/banlists/OCG.lflist.conf ./mercury/ocg/lflist.conf
COPY --from=evolution-core:latest /repositories/mercury-cards.cdb ./mercury/ocg/cards.cdb
COPY --from=evolution-core:latest /repositories/ygopro ./mercury/ocg/ygopro

# Mercury Alternatives (From Base Image)
COPY --from=evolution-core:latest /repositories/alternatives ./mercury/alternatives/

# USER node
CMD ["dumb-init", "node", "./src/index.js"]
99 changes: 99 additions & 0 deletions Dockerfile.base
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
FROM public.ecr.aws/docker/library/node:24.11.0-bullseye-slim AS core-builder

# Install CoreIntegrator dependencies via system packages
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && \
apt-get install -y --no-install-recommends \
libboost-all-dev \
libsqlite3-dev \
libjsoncpp-dev \
nlohmann-json3-dev \
libcurl4-openssl-dev \
git \
wget \
ca-certificates \
unzip \
zip \
linux-libc-dev \
cmake \
ninja-build \
g++ \
make

WORKDIR /app

# ---------------------------------------------------------
# STEP 1: Build CoreIntegrator (Rarely changes, Heavy)
# ---------------------------------------------------------
# Copy CoreIntegrator source
COPY ./core .

# Build the application using system dependencies
RUN cmake -B build -S . -DCMAKE_BUILD_TYPE=Release && \
cmake --build build

# ---------------------------------------------------------
# STEP 2: Clone Repositories (Changes Daily, Light)
# ---------------------------------------------------------
WORKDIR /repositories

# Add a build argument to invalidate cache for git clones if needed
ARG CACHEBUST=1

# Clone required repositories
RUN echo "Cache bust: $CACHEBUST" && \
git clone --depth 1 --branch master https://github.com/ProjectIgnis/CardScripts.git scripts && \
git clone --depth 1 --branch master https://github.com/ProjectIgnis/BabelCDB.git databases && \
git clone --depth 1 --branch master https://github.com/ProjectIgnis/LFLists banlists-project-ignis && \
git clone --depth 1 --branch master https://github.com/mycard/ygopro-scripts.git mercury-scripts && \
git clone --depth 1 --branch master https://github.com/evolutionygo/pre-release-database-cdb mercury-prerelases && \
git clone --depth 1 --branch main https://github.com/evolutionygo/cards-art-server mercury-arts && \
git clone --depth 1 --branch main https://github.com/termitaklk/lflist banlists-evolution && \
git clone --depth 1 --branch main https://github.com/evolutionygo/server-formats-cdb.git alternatives && \
wget -O mercury-lflist.conf https://raw.githubusercontent.com/termitaklk/koishi-Iflist/main/lflist.conf && \
wget -O mercury-cards.cdb https://github.com/purerosefallen/ygopro/raw/server/cards.cdb && \
rm -rf */.git

# Prepare banlists and pre-releases folder
RUN mkdir banlists mercury-pre-releases-cdbs && \
mv banlists-project-ignis/* banlists/ && \
mv banlists-evolution/* banlists/ && \
find mercury-prerelases mercury-arts -name "*.cdb" -exec cp {} mercury-pre-releases-cdbs/ \;

# Copy binary and setup directories
# This requires the context to have mercury/ygopro.
COPY ./mercury/ygopro .

# Rename mercury-scripts to script to match final image structure for symlinks
RUN mv mercury-scripts script

# Copy scripts and binaries into each alternative directory
RUN for dir in ./alternatives/*/; do \
echo "$dir/script"; \
rm -rf "$dir/script"; \
ln -s ../../script "$dir/script"; \
cp ygopro "$dir"; \
done

# Copy selected banlists into corresponding alternative folders
RUN bash -c 'set -e; \
declare -A MAP=( \
["2010.03 Edison(Pre Errata)"]="edison" \
["2014.04 HAT (Pre Errata)"]="hat" \
["jtp-oficial"]="jtp" \
["GOAT"]="goat" \
["Rush"]="rush" \
["Speed"]="speed" \
["Tengu.Plant"]="tengu" \
["World"]="world" \
["MD.2025.03"]="md" \
["Genesys"]="genesys" \
); \
for name in "${!MAP[@]}"; do \
cp "./banlists/${name}.lflist.conf" "./alternatives/${MAP[$name]}/lflist.conf"; \
done'

WORKDIR /app
# We could do a multi-stage to slim it down, but the point is to have
# all these artifacts available for the final image copy step.
Loading