Simplify build process and improve README
This commit is contained in:
parent
d58fffc7e5
commit
5ad4ad7cc2
16
Dockerfile
16
Dockerfile
@ -2,20 +2,12 @@ FROM rust:1.86.0-alpine3.21 AS base
|
|||||||
RUN apk add --no-cache musl-dev git
|
RUN apk add --no-cache musl-dev git
|
||||||
RUN cargo install cargo-chef --locked --version 0.1.71
|
RUN cargo install cargo-chef --locked --version 0.1.71
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
RUN git config --global --add safe.directory /app
|
|
||||||
ARG FEATURES
|
ARG FEATURES
|
||||||
RUN addgroup --gid 25565 --system composition && adduser --uid 25565 --system --ingroup composition --home /app composition
|
RUN addgroup --gid 25565 --system composition && adduser --uid 25565 --system --ingroup composition --home /app composition
|
||||||
RUN chown -R composition:composition /app
|
RUN chown -R composition:composition /app
|
||||||
RUN chown -R composition:composition /usr/local/cargo
|
RUN chown -R composition:composition /usr/local/cargo
|
||||||
USER composition
|
USER composition
|
||||||
|
RUN git config --global --add safe.directory /app
|
||||||
FROM base AS dev
|
|
||||||
RUN cargo install cargo-watch --locked --version 8.5.3
|
|
||||||
VOLUME /app
|
|
||||||
VOLUME /app/.git
|
|
||||||
EXPOSE 25565
|
|
||||||
ENTRYPOINT ["cargo", "watch", "-x"]
|
|
||||||
CMD ["run -- server"]
|
|
||||||
|
|
||||||
FROM base AS planner
|
FROM base AS planner
|
||||||
COPY Cargo.toml .
|
COPY Cargo.toml .
|
||||||
@ -33,12 +25,12 @@ COPY .git .git
|
|||||||
RUN cargo build --release --no-default-features --features $FEATURES
|
RUN cargo build --release --no-default-features --features $FEATURES
|
||||||
RUN strip target/release/composition
|
RUN strip target/release/composition
|
||||||
|
|
||||||
FROM alpine:3.21 AS prod
|
FROM alpine:3.21
|
||||||
RUN apk add --no-cache tini
|
RUN apk add --no-cache tini
|
||||||
RUN addgroup --gid 25565 --system composition && adduser --uid 25565 --system --ingroup composition --home /app composition
|
RUN addgroup --gid 25565 --system composition && adduser --uid 25565 --system --ingroup composition --home /app composition
|
||||||
VOLUME /app/data
|
VOLUME /app/data
|
||||||
WORKDIR /app/data
|
WORKDIR /app/data
|
||||||
COPY --from=builder /app/target/release/composition /app
|
COPY --from=builder /app/target/release/composition /usr/bin
|
||||||
EXPOSE 25565
|
EXPOSE 25565
|
||||||
USER composition
|
USER composition
|
||||||
ENTRYPOINT ["tini", "--", "/app/composition"]
|
ENTRYPOINT ["tini", "--", "/usr/bin/composition"]
|
||||||
|
120
README.md
120
README.md
@ -1,33 +1,117 @@
|
|||||||
# Composition
|
# 📓 Composition
|
||||||
|
|
||||||
Composition is a new Minecraft server written from the ground-up in Rust.
|
Composition is a new Minecraft server written from the ground-up in Rust.
|
||||||
|
|
||||||
Composition is targeting Minecraft version 1.21.1, protocol version 767.
|
Composition is targeting Minecraft version 1.21.1, protocol version 767.
|
||||||
The main goal is to get a working server, then optimize for speed (multi-threading/kubernetes/etc).
|
The main goal is to get a working server, then optimize for speed
|
||||||
|
(multi-threading/kubernetes/etc).
|
||||||
|
|
||||||
Composition is my personal project to learn more about networking,
|
Composition is my personal project to learn more about networking,
|
||||||
game development, and Rust and is not currently intended for production use.
|
game development, Rust, Docker, and CI/CD pipelines.
|
||||||
|
Composition is not currently intended for production use.
|
||||||
I want to use it as a platform to experiment with ideas about how a Minecraft
|
I want to use it as a platform to experiment with ideas about how a Minecraft
|
||||||
server could work, such as a tickless design, one that could run across a distributed
|
server could work, such as a tickless design, one that could run across a distributed
|
||||||
kubernetes cluster, or a world as a database that's accessed by multiple servers.
|
kubernetes cluster, or a world as a database that's accessed by multiple servers.
|
||||||
|
|
||||||
## Getting Started
|
## 🚀 Getting Started
|
||||||
|
|
||||||
- The only prerequisite for running Composition is to have Docker and Docker Compose installed.
|
- The only prerequisite for running Composition is to have Docker installed.
|
||||||
- Clone the project: `git clone https://github.com/garentyler/composition.git`
|
- Pull the latest version of the Docker image:
|
||||||
- Run it in proxy mode: `docker compose --profile proxy up`
|
`docker pull git.garen.dev/garentyler/composition:latest`
|
||||||
|
- Make sure a folder exists for the it to store its data. The uid/gid of the
|
||||||
|
process inside the container is `25565:25565`, so make sure the folder
|
||||||
|
is writable by that user.
|
||||||
|
|
||||||
Proxy mode will start an instance of `itzg/minecraft-server` on port 25565 and
|
To get the right file permissions, you can run the following:
|
||||||
the Composition proxy in 25566. This is useful for testing packet parsing and
|
|
||||||
handling.
|
|
||||||
- Run it in server mode: `docker compose --profile server up`
|
|
||||||
|
|
||||||
Server mode starts Composition on port 25566.
|
```sh
|
||||||
This is useful for testing the server logic and world generation.
|
mkdir -p composition-server
|
||||||
- To build release images, use `docker buildx bake -f docker-bake.hcl`.
|
sudo chown -R 25565:25565 composition-server
|
||||||
This will create a multi-arch image that can be run on amd64 and arm64.
|
sudo chmod -R 775 composition-server
|
||||||
|
```
|
||||||
|
|
||||||
## Project Structure
|
### 🕹️ Running Composition as a Server
|
||||||
|
|
||||||
|
Standalone command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -it -v .:/app/data --network host git.garen.dev/garentyler/composition server
|
||||||
|
```
|
||||||
|
|
||||||
|
Example docker-compose.yml file:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
services:
|
||||||
|
# Composition running as a server.
|
||||||
|
composition-server:
|
||||||
|
image: git.garen.dev/garentyler/composition:latest
|
||||||
|
container_name: composition-server
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "25565:25565"
|
||||||
|
volumes:
|
||||||
|
- ./composition-server:/app/data
|
||||||
|
command: server
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🌐 Running Composition as a Proxy
|
||||||
|
|
||||||
|
Standalone command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -it -v .:/app/data --network host git.garen.dev/garentyler/composition proxy
|
||||||
|
```
|
||||||
|
|
||||||
|
Example docker-compose.yml file:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
services:
|
||||||
|
# Example Minecraft server to run as a reference.
|
||||||
|
reference:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
container_name: reference
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "25565:25565"
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
VERSION: "1.21.1"
|
||||||
|
# Composition running as a proxy.
|
||||||
|
composition-proxy:
|
||||||
|
image: git.garen.dev/garentyler/composition:latest
|
||||||
|
container_name: composition-proxy
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
reference:
|
||||||
|
condition: service_healthy
|
||||||
|
restart: true
|
||||||
|
ports:
|
||||||
|
- "25566:25566"
|
||||||
|
volumes:
|
||||||
|
- ./composition-proxy:/app/data
|
||||||
|
command: proxy -U reference
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🛠️ Building From Source
|
||||||
|
|
||||||
|
To build Composition from source, you will need to have Rust and Cargo installed.
|
||||||
|
The stable toolchain is recommended, but the nightly toolchain may be required for some features.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
To build the Docker image, you will need to have Docker configured with Bake.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# To build both linux/amd64 and linux/arm64 images, use the following command:
|
||||||
|
docker buildx bake -f docker-bake.hcl
|
||||||
|
|
||||||
|
# To build only the linux/amd64 image, use the following command:
|
||||||
|
docker buildx bake -f docker-bake.hcl --set default.platform=linux/amd64
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🏗️ Project Structure
|
||||||
|
|
||||||
Composition is built using the async runtime and networking from Tokio.
|
Composition is built using the async runtime and networking from Tokio.
|
||||||
On startup, Composition sets up logging, reads the configuration, and
|
On startup, Composition sets up logging, reads the configuration, and
|
||||||
@ -36,7 +120,7 @@ start in (server, proxy, world, etc). The subcommand performs any
|
|||||||
startup tasks, such as loading the world, and then begins the main
|
startup tasks, such as loading the world, and then begins the main
|
||||||
event loop.
|
event loop.
|
||||||
|
|
||||||
### Cargo Features
|
### 🦀 Cargo Features
|
||||||
|
|
||||||
Composition has a non-optional core and multiple cargo features that can be enabled or disabled to configure functionality.
|
Composition has a non-optional core and multiple cargo features that can be enabled or disabled to configure functionality.
|
||||||
|
|
||||||
@ -46,7 +130,7 @@ The `proxy` feature enables the `composition proxy` command, which runs a proxy
|
|||||||
|
|
||||||
The `world` feature is not yet implemented. When finished, it will host a world server that can be accessed by multiple server cores.
|
The `world` feature is not yet implemented. When finished, it will host a world server that can be accessed by multiple server cores.
|
||||||
|
|
||||||
## Useful Resources
|
## 📋 Useful Resources
|
||||||
|
|
||||||
- [wiki.vg archive](https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge) (now merged with the Minecraft wiki)
|
- [wiki.vg archive](https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge) (now merged with the Minecraft wiki)
|
||||||
- [Protocol Specification](https://minecraft.wiki/w/Java_Edition_protocol)
|
- [Protocol Specification](https://minecraft.wiki/w/Java_Edition_protocol)
|
||||||
|
@ -18,7 +18,6 @@ target "default" {
|
|||||||
"${REGISTRY}/composition:${RELEASE_VERSION}",
|
"${REGISTRY}/composition:${RELEASE_VERSION}",
|
||||||
"${REGISTRY}/composition:${GITHUB_SHA}"
|
"${REGISTRY}/composition:${GITHUB_SHA}"
|
||||||
]
|
]
|
||||||
target = "prod"
|
|
||||||
args = {
|
args = {
|
||||||
FEATURES = "server,proxy"
|
FEATURES = "server,proxy"
|
||||||
}
|
}
|
||||||
|
@ -1,47 +1,12 @@
|
|||||||
# This file is only meant to provide a simple dev environment.
|
# This file is only meant to provide a convenient dev environment.
|
||||||
# For prod images, look at docker-bake.hcl.
|
# For prod images, look at docker-bake.hcl and README.md.
|
||||||
services:
|
services:
|
||||||
server:
|
|
||||||
container_name: composition
|
|
||||||
restart: unless-stopped
|
|
||||||
profiles: [server]
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
target: dev
|
|
||||||
command: [ "run -- server" ]
|
|
||||||
ports:
|
|
||||||
- "25566:25565"
|
|
||||||
volumes:
|
|
||||||
- .:/app
|
|
||||||
- .git:/app/.git
|
|
||||||
reference:
|
reference:
|
||||||
container_name: reference
|
container_name: reference
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
profiles: [server, proxy]
|
|
||||||
image: itzg/minecraft-server
|
image: itzg/minecraft-server
|
||||||
ports:
|
ports:
|
||||||
- "25565:25565"
|
- "25565:25565"
|
||||||
environment:
|
environment:
|
||||||
EULA: "TRUE"
|
EULA: "TRUE"
|
||||||
VERSION: "1.21.1"
|
VERSION: "1.21.1"
|
||||||
proxy:
|
|
||||||
container_name: composition-proxy
|
|
||||||
restart: unless-stopped
|
|
||||||
profiles: [proxy]
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
target: dev
|
|
||||||
depends_on:
|
|
||||||
reference:
|
|
||||||
condition: service_healthy
|
|
||||||
restart: true
|
|
||||||
command: [ "run -- proxy -U reference -l trace" ]
|
|
||||||
ports:
|
|
||||||
- "25566:25566"
|
|
||||||
volumes:
|
|
||||||
- .:/app
|
|
||||||
- .git:/app/.git
|
|
||||||
environment:
|
|
||||||
CARGO_HOME: "/app/.cargo"
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user