From 5a6d3da26dd3cacfb0066769b0db97492ce0a858 Mon Sep 17 00:00:00 2001 From: Yuzu Date: Fri, 16 Jan 2026 02:28:44 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A6=20build:=20Add=20devcontainer=20fo?= =?UTF-8?q?r=20local=20Kubernetes=20development?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .devcontainer/Dockerfile | 78 ++++++++++++++++++++++++++++++++ .devcontainer/devcontainer.json | 31 +++++++++++++ .devcontainer/docker-compose.yml | 55 ++++++++++++++++++++++ .devcontainer/post-create.sh | 57 +++++++++++++++++++++++ 4 files changed, 221 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml create mode 100755 .devcontainer/post-create.sh diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..1ddef6a --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,78 @@ +FROM ubuntu:24.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# Install base packages +RUN apt-get update && apt-get install -y --no-install-recommends \ + openssh-server \ + passwd \ + sudo \ + curl \ + wget \ + git \ + jq \ + unzip \ + ca-certificates \ + gnupg \ + lsb-release \ + iptables \ + iproute2 \ + postgresql-client \ + apt-transport-https \ + software-properties-common \ + && rm -rf /var/lib/apt/lists/* + +# Install Node.js 24 +RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \ + && apt-get install -y --no-install-recommends nodejs \ + && rm -rf /var/lib/apt/lists/* + +# Install Bun +RUN curl -fsSL https://bun.sh/install | bash \ + && mv /root/.bun/bin/bun /usr/local/bin/ \ + && ln -s /usr/local/bin/bun /usr/local/bin/bunx + +# Install Docker +RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io docker-compose-plugin \ + && rm -rf /var/lib/apt/lists/* + +# Install kubectl +RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/$(dpkg --print-architecture)/kubectl" \ + && install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl \ + && rm kubectl + +# Install Helm +RUN curl -fsSL https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash + +# Enable systemd +RUN find /lib/systemd/system/sysinit.target.wants -mindepth 1 -not -name "systemd-tmpfiles-setup.service" -delete; \ + find /lib/systemd/system/multi-user.target.wants -mindepth 1 -not -name "systemd-user-sessions.service" -delete; \ + rm -f /etc/systemd/system/*.wants/*; \ + rm -f /lib/systemd/system/local-fs.target.wants/*; \ + rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ + rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ + rm -f /lib/systemd/system/basic.target.wants/*; \ + rm -f /lib/systemd/system/anaconda.target.wants/*; + +# Create dev user with host UID/GID for seamless file permissions +ARG HOST_UID=1000 +ARG HOST_GID=1000 +RUN userdel -r $(getent passwd ${HOST_UID} | cut -d: -f1) 2>/dev/null || true && \ + groupdel $(getent group ${HOST_GID} | cut -d: -f1) 2>/dev/null || true && \ + groupadd -g ${HOST_GID} dev && \ + useradd -m -s /bin/bash -u ${HOST_UID} -g ${HOST_GID} dev && \ + echo "dev:dev" | chpasswd && \ + echo 'dev ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/dev && \ + chmod 440 /etc/sudoers.d/dev && \ + usermod -aG docker dev + +# Setup directories +RUN mkdir -p /home/dev/.kube && chown -R dev:dev /home/dev + +WORKDIR /workspace + +VOLUME [ "/sys/fs/cgroup" ] +CMD ["/usr/sbin/init"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e7e1fdb --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "Minikura Development", + "dockerComposeFile": "./docker-compose.yml", + "service": "devcontainer", + "workspaceFolder": "/workspace", + "remoteUser": "dev", + + "postCreateCommand": "bash /workspace/.devcontainer/post-create.sh", + + "forwardPorts": [3000, 3001, 5432, 6443, 25565, 25577], + + "customizations": { + "vscode": { + "extensions": [ + "biomejs.biome", + "Prisma.prisma", + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker", + "bradlc.vscode-tailwindcss", + "redhat.vscode-yaml" + ], + "settings": { + "editor.defaultFormatter": "biomejs.biome", + "editor.formatOnSave": true, + "[prisma]": { + "editor.defaultFormatter": "Prisma.prisma" + } + } + } + } +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..864a54b --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,55 @@ +name: "minikura-devcontainer" +services: + devcontainer: + tty: true + privileged: true + cgroup: host + build: + context: . + dockerfile: Dockerfile + args: + HOST_UID: ${HOST_UID:-1000} + HOST_GID: ${HOST_GID:-1000} + tmpfs: + - /var/lib/docker:mode=0777,dev,size=15g,suid,exec + - /var/lib/rancher:mode=0777,dev,size=15g,suid,exec + - /run + ports: + - "3000:3000" # backend API + - "3001:3001" # web frontend + - "6443:6443" # k3s API + - "25565:25565" # minecraft + - "25577:25577" # velocity + volumes: + - "../:/workspace" + - "/sys/fs/cgroup:/sys/fs/cgroup:rw" + working_dir: "/workspace" + depends_on: + db: + condition: service_healthy + environment: + - KUBECONFIG=/home/dev/.kube/config + - DATABASE_URL=postgresql://postgres:postgres@db:5432/minikura?sslmode=disable + - KUBERNETES_NAMESPACE=minikura + - KUBERNETES_SKIP_TLS_VERIFY=true + - ENABLE_CRD_REFLECTION=true + + db: + image: postgres:17 + restart: unless-stopped + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: minikura + volumes: + - postgres-data:/var/lib/postgresql/data + ports: + - "5433:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 + +volumes: + postgres-data: diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100755 index 0000000..420b71e --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,57 @@ +#!/bin/bash +set -e + +echo "==============================================" +echo " Minikura Development Environment Setup" +echo "==============================================" + +# Start Docker +echo "==> Starting Docker..." +sudo service docker start +sleep 2 +sudo chmod 666 /var/run/docker.sock + +# Install and start k3s via install script (sets up systemd service) +echo "==> Installing k3s..." +curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--write-kubeconfig-mode 644 --disable traefik" sh - + +# Wait for k3s to be ready +echo "==> Waiting for k3s..." +sleep 5 + +# Configure kubectl +echo "==> Configuring kubectl..." +mkdir -p /home/dev/.kube +until [ -f /etc/rancher/k3s/k3s.yaml ]; do sleep 1; done +sudo cp /etc/rancher/k3s/k3s.yaml /home/dev/.kube/config +sudo chown dev:dev /home/dev/.kube/config + +# Wait for node +echo "==> Waiting for node..." +for i in {1..30}; do + kubectl get nodes 2>/dev/null | grep -q " Ready" && break + sleep 2 +done + +# Create namespace +kubectl create namespace minikura --dry-run=client -o yaml | kubectl apply -f - 2>/dev/null || true + +# Install dependencies +echo "==> Installing dependencies..." +cd /workspace +sudo rm -rf node_modules apps/*/node_modules packages/*/node_modules 2>/dev/null || true +sudo chown -R dev:dev /workspace +bun install + +# Setup database +echo "==> Setting up database..." +bun run db:generate +bun run db:push + +echo "" +echo "==============================================" +echo " Ready! Commands:" +echo " bun run dev - Start backend + web" +echo " bun run k8s:dev - Start K8s operator" +echo " kubectl get nodes" +echo "=============================================="