This commit is contained in:
@@ -29,16 +29,27 @@ jobs:
|
|||||||
username: ${{ gitea.actor }}
|
username: ${{ gitea.actor }}
|
||||||
password: ${{ secrets.CI_TOKEN }}
|
password: ${{ secrets.CI_TOKEN }}
|
||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build and push frontend image
|
||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
target: frontend
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:${{ steps.tag.outputs.sha }}
|
${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:${{ steps.tag.outputs.sha }}
|
||||||
${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:latest
|
${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:latest
|
||||||
|
|
||||||
- name: Update image tag in gitops repo
|
- name: Build and push backend image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
target: backend
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}-tina:${{ steps.tag.outputs.sha }}
|
||||||
|
${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}-tina:latest
|
||||||
|
|
||||||
|
- name: Update image tags in gitops repo
|
||||||
env:
|
env:
|
||||||
CI_TOKEN: ${{ secrets.CI_TOKEN }}
|
CI_TOKEN: ${{ secrets.CI_TOKEN }}
|
||||||
SHA: ${{ steps.tag.outputs.sha }}
|
SHA: ${{ steps.tag.outputs.sha }}
|
||||||
@@ -52,7 +63,10 @@ jobs:
|
|||||||
sed -i \
|
sed -i \
|
||||||
"s|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:.*|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:${SHA}|" \
|
"s|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:.*|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:${SHA}|" \
|
||||||
"apps/${{ env.APP }}/deployment.yaml"
|
"apps/${{ env.APP }}/deployment.yaml"
|
||||||
git add "apps/${{ env.APP }}/deployment.yaml"
|
sed -i \
|
||||||
|
"s|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}-tina:.*|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}-tina:${SHA}|" \
|
||||||
|
"apps/${{ env.APP }}/tina-backend-deployment.yaml"
|
||||||
|
git add "apps/${{ env.APP }}/deployment.yaml" "apps/${{ env.APP }}/tina-backend-deployment.yaml"
|
||||||
git diff --cached --quiet && echo "No changes, skipping commit." && exit 0
|
git diff --cached --quiet && echo "No changes, skipping commit." && exit 0
|
||||||
git commit -m "ci: update ${{ env.APP }} to ${SHA}"
|
git commit -m "ci: update ${{ env.APP }} to ${SHA}"
|
||||||
git push origin main
|
git push origin main
|
||||||
|
|||||||
+17
-10
@@ -1,19 +1,26 @@
|
|||||||
|
# Shared build: generates /dist (Astro site + admin SPA) and tina/__generated__
|
||||||
FROM node:20-alpine AS builder
|
FROM node:20-alpine AS builder
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
COPY package.json package-lock.json ./
|
RUN npm ci --legacy-peer-deps
|
||||||
RUN npm ci
|
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN npm run build
|
ENV TINA_PUBLIC_IS_LOCAL=true
|
||||||
|
RUN npm run build:tina
|
||||||
FROM nginx:alpine
|
|
||||||
|
|
||||||
|
# Frontend: Nginx serving the static site + TinaCMS admin SPA
|
||||||
|
FROM nginx:alpine AS frontend
|
||||||
RUN rm /etc/nginx/conf.d/default.conf
|
RUN rm /etc/nginx/conf.d/default.conf
|
||||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
# Backend: TinaCMS self-hosted API server
|
||||||
|
FROM node:20-alpine AS backend
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm ci --legacy-peer-deps --omit=dev
|
||||||
|
COPY backend/ ./backend/
|
||||||
|
COPY --from=builder /app/tina/__generated__ ./tina/__generated__
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
EXPOSE 3000
|
||||||
|
CMD ["node", "backend/index.js"]
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import express from 'express'
|
||||||
|
import { TinaNodeBackend, LocalBackendAuthProvider, createDatabase, createLocalDatabase } from '@tinacms/datalayer'
|
||||||
|
import { AuthJsBackendAuthProvider, TinaAuthJSOptions } from 'tinacms-authjs'
|
||||||
|
import { MongodbLevel } from 'mongodb-level'
|
||||||
|
import { GitHubProvider } from 'tinacms-gitprovider-github'
|
||||||
|
|
||||||
|
const isLocal = process.env.TINA_PUBLIC_IS_LOCAL === 'true'
|
||||||
|
const branch = process.env.GITEA_BRANCH || 'main'
|
||||||
|
|
||||||
|
const databaseClient = isLocal
|
||||||
|
? createLocalDatabase()
|
||||||
|
: createDatabase({
|
||||||
|
gitProvider: new GitHubProvider({
|
||||||
|
branch,
|
||||||
|
owner: process.env.GITEA_OWNER,
|
||||||
|
repo: process.env.GITEA_REPO,
|
||||||
|
token: process.env.GITEA_TOKEN,
|
||||||
|
octokitOptions: {
|
||||||
|
baseUrl: 'https://git.idealconnected.com/api/v1',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
databaseAdapter: new MongodbLevel({
|
||||||
|
collectionName: 'tinacms',
|
||||||
|
dbName: 'tinacms',
|
||||||
|
mongoUri: process.env.MONGODB_URI,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
const authProvider = isLocal
|
||||||
|
? LocalBackendAuthProvider()
|
||||||
|
: AuthJsBackendAuthProvider({
|
||||||
|
authOptions: TinaAuthJSOptions({
|
||||||
|
databaseClient,
|
||||||
|
secret: process.env.NEXTAUTH_SECRET,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
const tinaHandler = TinaNodeBackend({
|
||||||
|
authProvider,
|
||||||
|
databaseClient,
|
||||||
|
})
|
||||||
|
|
||||||
|
const app = express()
|
||||||
|
app.use(express.json())
|
||||||
|
|
||||||
|
// Mount at root — TinaNodeBackend routes /api/tina/* internally
|
||||||
|
app.all('*', (req, res) => tinaHandler(req, res))
|
||||||
|
|
||||||
|
const port = process.env.PORT || 3000
|
||||||
|
app.listen(port, () => console.log(`Tina backend running on port ${port}`))
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"name": "Admin",
|
||||||
|
"email": "admin@theater-jb.ch",
|
||||||
|
"username": "admin",
|
||||||
|
"password": "changeme"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Generated
+3590
-466
File diff suppressed because it is too large
Load Diff
+8
-1
@@ -13,8 +13,15 @@
|
|||||||
"@astrojs/mdx": "^4.3.13",
|
"@astrojs/mdx": "^4.3.13",
|
||||||
"@tailwindcss/vite": "^4.2.4",
|
"@tailwindcss/vite": "^4.2.4",
|
||||||
"@tinacms/cli": "^2.1.2",
|
"@tinacms/cli": "^2.1.2",
|
||||||
|
"@tinacms/datalayer": "^2.0.18",
|
||||||
"astro": "^5.16.16",
|
"astro": "^5.16.16",
|
||||||
|
"express": "^4.19.0",
|
||||||
|
"mongodb-level": "^0.0.4",
|
||||||
|
"next": "^14.2.0",
|
||||||
|
"next-auth": "^4.24.7",
|
||||||
"tailwindcss": "^4.2.4",
|
"tailwindcss": "^4.2.4",
|
||||||
"tinacms": "^3.3.2"
|
"tinacms": "^3.3.2",
|
||||||
|
"tinacms-authjs": "^21.0.5",
|
||||||
|
"tinacms-gitprovider-github": "^4.1.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -1,10 +1,9 @@
|
|||||||
import { defineConfig } from "tinacms";
|
import { defineConfig } from "tinacms";
|
||||||
|
import { UsernamePasswordAuthJSProvider, TinaUserCollection } from "tinacms-authjs/dist/tinacms";
|
||||||
|
|
||||||
// Your TinaCMS configuration
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
branch: process.env.TINA_BRANCH || "main",
|
contentApiUrlOverride: "/api/tina/gql",
|
||||||
clientId: process.env.TINA_CLIENT_ID || "",
|
authProvider: new UsernamePasswordAuthJSProvider(),
|
||||||
token: process.env.TINA_TOKEN || "",
|
|
||||||
|
|
||||||
build: {
|
build: {
|
||||||
outputFolder: "admin",
|
outputFolder: "admin",
|
||||||
@@ -19,6 +18,7 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
schema: {
|
schema: {
|
||||||
collections: [
|
collections: [
|
||||||
|
TinaUserCollection,
|
||||||
{
|
{
|
||||||
name: "post",
|
name: "post",
|
||||||
label: "Blog Posts",
|
label: "Blog Posts",
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { createDatabase, createLocalDatabase } from '@tinacms/datalayer'
|
||||||
|
import { MongodbLevel } from 'mongodb-level'
|
||||||
|
import { GitHubProvider } from 'tinacms-gitprovider-github'
|
||||||
|
|
||||||
|
const isLocal = process.env.TINA_PUBLIC_IS_LOCAL === 'true'
|
||||||
|
const branch = process.env.GITEA_BRANCH || 'main'
|
||||||
|
|
||||||
|
export default isLocal
|
||||||
|
? createLocalDatabase()
|
||||||
|
: createDatabase({
|
||||||
|
gitProvider: new GitHubProvider({
|
||||||
|
branch,
|
||||||
|
owner: process.env.GITEA_OWNER!,
|
||||||
|
repo: process.env.GITEA_REPO!,
|
||||||
|
token: process.env.GITEA_TOKEN!,
|
||||||
|
octokitOptions: {
|
||||||
|
// Gitea's GitHub-compatible API
|
||||||
|
baseUrl: 'https://git.idealconnected.com/api/v1',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
databaseAdapter: new MongodbLevel({
|
||||||
|
collectionName: 'tinacms',
|
||||||
|
dbName: 'tinacms',
|
||||||
|
mongoUri: process.env.MONGODB_URI!,
|
||||||
|
}),
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user