diff --git a/deploy/ansible/vm-playbook.yaml b/deploy/ansible/vm-playbook.yaml new file mode 100644 index 0000000..05f617e --- /dev/null +++ b/deploy/ansible/vm-playbook.yaml @@ -0,0 +1,25 @@ +--- +- name: Deploy XControl on VM + hosts: all + become: true + tasks: + - name: Install Docker + apt: + name: docker.io + state: present + update_cache: yes + + - name: Ensure Docker service is running + service: + name: docker + state: started + enabled: true + + - name: Run XControl container + community.docker.docker_container: + name: xcontrol + image: ghcr.io/example/xcontrol:latest + ports: + - "8080:8080" + env: + KB_DSN: "postgres://user:pass@db:5432/xcontrol?sslmode=disable" diff --git a/deploy/charts/xcontrol/Chart.yaml b/deploy/charts/xcontrol/Chart.yaml new file mode 100644 index 0000000..7fd4a62 --- /dev/null +++ b/deploy/charts/xcontrol/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: xcontrol +version: 0.1.0 +description: XControl platform chart +type: application +appVersion: "1.0" diff --git a/deploy/charts/xcontrol/templates/deployment.yaml b/deploy/charts/xcontrol/templates/deployment.yaml new file mode 100644 index 0000000..807518d --- /dev/null +++ b/deploy/charts/xcontrol/templates/deployment.yaml @@ -0,0 +1,28 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: xcontrol +spec: + replicas: 1 + selector: + matchLabels: + app: xcontrol + template: + metadata: + labels: + app: xcontrol + spec: + containers: + - name: xcontrol + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- if .Values.postgresql.enabled }} + - name: KB_DSN + value: "postgres://{{ .Values.postgresql.auth.user }}:{{ .Values.postgresql.auth.password }}@xcontrol-postgres:5432/{{ .Values.postgresql.auth.database }}?sslmode=disable" + {{- else if .Values.externalPostgresql.enabled }} + - name: KB_DSN + value: "postgres://{{ .Values.externalPostgresql.user }}:{{ .Values.externalPostgresql.password }}@{{ .Values.externalPostgresql.host }}/{{ .Values.externalPostgresql.database }}" + {{- end }} + ports: + - containerPort: 8080 diff --git a/deploy/charts/xcontrol/templates/postgres.yaml b/deploy/charts/xcontrol/templates/postgres.yaml new file mode 100644 index 0000000..0b7c848 --- /dev/null +++ b/deploy/charts/xcontrol/templates/postgres.yaml @@ -0,0 +1,43 @@ +{{- if .Values.postgresql.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: xcontrol-postgres +spec: + type: ClusterIP + selector: + app: xcontrol-postgres + ports: + - port: 5432 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: xcontrol-postgres +spec: + replicas: 1 + selector: + matchLabels: + app: xcontrol-postgres + template: + metadata: + labels: + app: xcontrol-postgres + spec: + containers: + - name: postgres + image: {{ .Values.postgresql.image }} + env: + - name: POSTGRES_DB + value: {{ .Values.postgresql.auth.database }} + - name: POSTGRES_USER + value: {{ .Values.postgresql.auth.user }} + - name: POSTGRES_PASSWORD + value: {{ .Values.postgresql.auth.password }} + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumes: + - name: data + emptyDir: {} +{{- end }} diff --git a/deploy/charts/xcontrol/templates/service.yaml b/deploy/charts/xcontrol/templates/service.yaml new file mode 100644 index 0000000..81e29a5 --- /dev/null +++ b/deploy/charts/xcontrol/templates/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: xcontrol +spec: + type: {{ .Values.service.type }} + selector: + app: xcontrol + ports: + - port: {{ .Values.service.port }} + targetPort: 8080 diff --git a/deploy/charts/xcontrol/values.yaml b/deploy/charts/xcontrol/values.yaml new file mode 100644 index 0000000..318fd35 --- /dev/null +++ b/deploy/charts/xcontrol/values.yaml @@ -0,0 +1,23 @@ +image: + repository: ghcr.io/example/xcontrol + tag: latest + pullPolicy: IfNotPresent + +service: + type: ClusterIP + port: 8080 + +postgresql: + enabled: true + image: postgres:16 + auth: + user: xcontrol + password: xcontrol + database: xcontrol + +externalPostgresql: + enabled: false + host: "" + user: "" + password: "" + database: "" diff --git a/deploy/nerdctl-compose.yml b/deploy/nerdctl-compose.yml new file mode 100644 index 0000000..e314c53 --- /dev/null +++ b/deploy/nerdctl-compose.yml @@ -0,0 +1,20 @@ +version: "3" +services: + postgres: + image: postgres:16 + environment: + POSTGRES_DB: xcontrol + POSTGRES_USER: xcontrol + POSTGRES_PASSWORD: xcontrol + volumes: + - pgdata:/var/lib/postgresql/data + xcontrol: + image: ghcr.io/example/xcontrol:latest + environment: + KB_DSN: postgres://xcontrol:xcontrol@postgres:5432/xcontrol?sslmode=disable + ports: + - "8080:8080" + depends_on: + - postgres +volumes: + pgdata: diff --git a/modules/markmind/Dockerfile b/modules/markmind/Dockerfile new file mode 100644 index 0000000..e1268e0 --- /dev/null +++ b/modules/markmind/Dockerfile @@ -0,0 +1,14 @@ +# Build XControl API including markmind module +FROM golang:1.21 AS builder +WORKDIR /src +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /markmind ./cmd/api + +FROM gcr.io/distroless/base-debian12 +WORKDIR / +COPY --from=builder /markmind /markmind +EXPOSE 8080 +USER nonroot +ENTRYPOINT ["/markmind"] diff --git a/ui/homepage/Dockerfile b/ui/homepage/Dockerfile new file mode 100644 index 0000000..075010d --- /dev/null +++ b/ui/homepage/Dockerfile @@ -0,0 +1,12 @@ +# Build static homepage +FROM node:20 AS build +WORKDIR /app +COPY ui/homepage/package.json ui/homepage/yarn.lock ./ +RUN yarn install --frozen-lockfile +COPY ui/homepage . +RUN yarn build + +FROM nginx:alpine +COPY --from=build /app/out /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx","-g","daemon off;"] diff --git a/ui/panel/Dockerfile b/ui/panel/Dockerfile new file mode 100644 index 0000000..f776cc2 --- /dev/null +++ b/ui/panel/Dockerfile @@ -0,0 +1,12 @@ +# Build admin panel static site +FROM node:20 AS build +WORKDIR /app +COPY ui/panel/package*.json ./ +RUN npm ci +COPY ui/panel . +RUN npm run build + +FROM nginx:alpine +COPY --from=build /app/out /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx","-g","daemon off;"]