build(docker): add container setup with persistent ./data volume
Add a multi-stage Dockerfile (Vue build + .NET 10 publish) and a docker-compose service exposing port 8080 with a single bind mount ./data -> /app/data for SurrealDB persistence. Include an example compose file, a .dockerignore, and document Docker usage and version 0.0.1 in the README.
This commit is contained in:
@@ -0,0 +1,27 @@
|
|||||||
|
# Git / IDE
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.vs
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
*.user
|
||||||
|
|
||||||
|
# .NET build artifacts
|
||||||
|
**/bin
|
||||||
|
**/obj
|
||||||
|
|
||||||
|
# Node
|
||||||
|
**/node_modules
|
||||||
|
|
||||||
|
# Build output (budowany wewnątrz obrazu)
|
||||||
|
client/dist
|
||||||
|
backend/wwwroot
|
||||||
|
|
||||||
|
# Local SurrealDB data — dostarczane przez wolumen ./data
|
||||||
|
data
|
||||||
|
backend/data
|
||||||
|
|
||||||
|
# Env / docs
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
backend/local-docs
|
||||||
@@ -13,6 +13,9 @@ Thumbs.db
|
|||||||
bin/
|
bin/
|
||||||
obj/
|
obj/
|
||||||
|
|
||||||
|
# Local SurrealDB data (embedded RocksDB) — persisted next to the running app
|
||||||
|
data/
|
||||||
|
|
||||||
# Node
|
# Node
|
||||||
node_modules/
|
node_modules/
|
||||||
dist/
|
dist/
|
||||||
@@ -28,3 +31,7 @@ backend/local-docs/
|
|||||||
.env
|
.env
|
||||||
.env.*
|
.env.*
|
||||||
!.env.example
|
!.env.example
|
||||||
|
|
||||||
|
# Docker — lokalne nadpisania
|
||||||
|
docker-compose.override.yaml
|
||||||
|
docker-compose.override.yml
|
||||||
|
|||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
# --- Stage 1: build klienta (Vue 3 + Vite) ---
|
||||||
|
FROM node:22-alpine AS client
|
||||||
|
WORKDIR /src/client
|
||||||
|
COPY client/package.json client/package-lock.json ./
|
||||||
|
RUN npm ci
|
||||||
|
COPY client/ ./
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# --- Stage 2: build i publish backendu (ASP.NET Core, .NET 10) ---
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
||||||
|
WORKDIR /src
|
||||||
|
COPY backend/TarninaHub.csproj ./backend/
|
||||||
|
RUN dotnet restore ./backend/TarninaHub.csproj
|
||||||
|
COPY backend/ ./backend/
|
||||||
|
COPY --from=client /src/client/dist ./backend/wwwroot/
|
||||||
|
RUN dotnet publish ./backend/TarninaHub.csproj \
|
||||||
|
--configuration Release \
|
||||||
|
--output /app/publish \
|
||||||
|
/p:UseAppHost=false
|
||||||
|
|
||||||
|
# --- Stage 3: runtime ---
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ARG APP_VERSION=0.0.1
|
||||||
|
LABEL org.opencontainers.image.title="TarninaHub" \
|
||||||
|
org.opencontainers.image.version="${APP_VERSION}"
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends curl \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ENV ASPNETCORE_ENVIRONMENT=Production \
|
||||||
|
ASPNETCORE_URLS=http://+:8080 \
|
||||||
|
DOTNET_EnableDiagnostics=0
|
||||||
|
|
||||||
|
COPY --from=build /app/publish ./
|
||||||
|
|
||||||
|
# Jedyny wolumen aplikacji: trwałe dane SurrealDB (embedded RocksDB).
|
||||||
|
RUN mkdir -p /app/data
|
||||||
|
VOLUME ["/app/data"]
|
||||||
|
|
||||||
|
EXPOSE 8080
|
||||||
|
ENTRYPOINT ["dotnet", "TarninaHub.dll"]
|
||||||
@@ -1,11 +1,14 @@
|
|||||||
# hubmi
|
# TarninaHub
|
||||||
|
|
||||||
|
**Wersja: 0.0.1**
|
||||||
|
|
||||||
Platforma Małopolskiego Hubu Innowacji Społecznych (MVP hackathonu).
|
Platforma Małopolskiego Hubu Innowacji Społecznych (MVP hackathonu).
|
||||||
|
|
||||||
- **backend/** — aplikacja backendowa w C# (ASP.NET Core, `HubMi.Api`).
|
- **backend/** — aplikacja backendowa w C# (ASP.NET Core, `TarninaHub`).
|
||||||
- **client/** — aplikacja frontendowa Vue 3 + TypeScript (Vite).
|
- **client/** — aplikacja frontendowa Vue 3 + TypeScript (Vite).
|
||||||
- **scripts/** — skrypty budujące całość.
|
- **scripts/** — skrypty budujące całość.
|
||||||
- `HubMi.slnx` — solution .NET.
|
- `TarninaHub.slnx` — solution .NET.
|
||||||
|
- `Dockerfile` + `docker-compose.yaml` — uruchomienie kontenerowe.
|
||||||
|
|
||||||
## Wymagania
|
## Wymagania
|
||||||
|
|
||||||
@@ -34,15 +37,33 @@ npm --prefix client run copy # kopiuje client/dist -> backend/wwwroot
|
|||||||
node scripts/build.mjs # buduje całość (client + copy + backend)
|
node scripts/build.mjs # buduje całość (client + copy + backend)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Docker
|
||||||
|
|
||||||
|
```pwsh
|
||||||
|
cp docker-compose.yaml.example docker-compose.yaml
|
||||||
|
docker compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
- Aplikacja: http://localhost:8080
|
||||||
|
- Dane: `./data` (bind mount, trwałe — SurrealDB embedded RocksDB)
|
||||||
|
- Obraz: `tarninahub:0.0.1`
|
||||||
|
|
||||||
|
Wolumen hosta można wskazać zmienną `TARNINAHUB_PORT` (domyślnie `8080`).
|
||||||
|
Plik `docker-compose.yaml.example` jest szablonem; `docker-compose.yaml` możesz
|
||||||
|
dostosować lokalnie.
|
||||||
|
|
||||||
## Struktura
|
## Struktura
|
||||||
|
|
||||||
```
|
```
|
||||||
hubmi/
|
TarninaHub/
|
||||||
├─ backend/ # ASP.NET Core Web API + wwwroot (build z client)
|
├─ backend/ # ASP.NET Core Web API + wwwroot (build z client)
|
||||||
├─ client/ # Vue 3 + TS + Vite
|
├─ client/ # Vue 3 + TS + Vite
|
||||||
├─ scripts/
|
├─ scripts/
|
||||||
│ ├─ build.mjs # build całości
|
│ ├─ build.mjs # build całości
|
||||||
│ └─ copy-client.mjs # client/dist -> backend/wwwroot
|
│ └─ copy-client.mjs # client/dist -> backend/wwwroot
|
||||||
├─ HubMi.slnx
|
├─ Dockerfile # multi-stage: client + backend
|
||||||
|
├─ docker-compose.yaml # uruchomienie (bind ./data)
|
||||||
|
├─ docker-compose.yaml.example
|
||||||
|
├─ TarninaHub.slnx
|
||||||
└─ README.md
|
└─ README.md
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
name: tarninahub
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: tarninahub:0.0.1
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
APP_VERSION: 0.0.1
|
||||||
|
container_name: tarninahub
|
||||||
|
restart: unless-stopped
|
||||||
|
# RocksDB zapisuje do bind-mountu ./data; root upraszcza uprawnienia (MVP).
|
||||||
|
user: "0:0"
|
||||||
|
ports:
|
||||||
|
- "${TARNINAHUB_PORT:-8080}:8080"
|
||||||
|
environment:
|
||||||
|
ASPNETCORE_ENVIRONMENT: Production
|
||||||
|
ASPNETCORE_URLS: http://+:8080
|
||||||
|
SurrealDb__Namespace: hubmi
|
||||||
|
SurrealDb__Database: hubmi
|
||||||
|
SurrealDb__DataDirectory: data
|
||||||
|
volumes:
|
||||||
|
# Jedyny volumen aplikacji — trwałe dane (SurrealDB / RocksDB).
|
||||||
|
- ./data:/app/data
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-fsS", "http://localhost:8080/api/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
start_period: 20s
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# TarninaHub — szablon docker-compose (wersja projektu 0.0.1)
|
||||||
|
#
|
||||||
|
# Użycie:
|
||||||
|
# cp docker-compose.yaml.example docker-compose.yaml
|
||||||
|
# docker compose up --build
|
||||||
|
#
|
||||||
|
# Aplikacja: http://localhost:8080
|
||||||
|
# Dane: ./data (bind mount, trwałe, SurrealDB embedded RocksDB)
|
||||||
|
|
||||||
|
name: tarninahub
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
# Obraz budowany lokalnie z Dockerfile (multi-stage: klient Vue + backend .NET).
|
||||||
|
image: tarninahub:${APP_VERSION:-0.0.1}
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
APP_VERSION: ${APP_VERSION:-0.0.1}
|
||||||
|
container_name: tarninahub
|
||||||
|
restart: unless-stopped
|
||||||
|
# RocksDB zapisuje do bind-mountu ./data; root upraszcza uprawnienia (MVP).
|
||||||
|
# W produkcji użyj named volume albo dopasuj właściciela katalogu ./data.
|
||||||
|
user: "0:0"
|
||||||
|
ports:
|
||||||
|
- "${TARNINAHUB_PORT:-8080}:8080"
|
||||||
|
environment:
|
||||||
|
ASPNETCORE_ENVIRONMENT: Production
|
||||||
|
ASPNETCORE_URLS: http://+:8080
|
||||||
|
# SurrealDB — wbudowany silnik RocksDB (domyślnie), dane w /app/data.
|
||||||
|
SurrealDb__Namespace: hubmi
|
||||||
|
SurrealDb__Database: hubmi
|
||||||
|
SurrealDb__DataDirectory: data
|
||||||
|
# Tryb zdalny (opcjonalnie) — wskaż zewnętrzny serwer SurrealDB zamiast
|
||||||
|
# wbudowanego RocksDB. Wtedy usuń `user: "0:0"` i przekieruj port 8010.
|
||||||
|
# SurrealDb__RemoteUrl: ws://127.0.0.1:8010/rpc
|
||||||
|
# SurrealDb__Username: root
|
||||||
|
# SurrealDb__Password: root
|
||||||
|
volumes:
|
||||||
|
# Jedyny volumen aplikacji — trwałe dane (SurrealDB / RocksDB).
|
||||||
|
- ./data:/app/data
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-fsS", "http://localhost:8080/api/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
start_period: 20s
|
||||||
Reference in New Issue
Block a user