This commit is contained in:
@@ -29,16 +29,27 @@ jobs:
|
||||
username: ${{ gitea.actor }}
|
||||
password: ${{ secrets.CI_TOKEN }}
|
||||
|
||||
- name: Build and push Docker image
|
||||
- name: Build and push frontend image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
target: frontend
|
||||
push: true
|
||||
tags: |
|
||||
${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:${{ steps.tag.outputs.sha }}
|
||||
${{ 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:
|
||||
CI_TOKEN: ${{ secrets.CI_TOKEN }}
|
||||
SHA: ${{ steps.tag.outputs.sha }}
|
||||
@@ -52,7 +63,10 @@ jobs:
|
||||
sed -i \
|
||||
"s|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:.*|image: ${{ env.REGISTRY }}/${{ env.ORG }}/${{ env.APP }}:${SHA}|" \
|
||||
"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 commit -m "ci: update ${{ env.APP }} to ${SHA}"
|
||||
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
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm ci
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm ci --legacy-peer-deps
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
ENV TINA_PUBLIC_IS_LOCAL=true
|
||||
RUN npm run build:tina
|
||||
|
||||
# Frontend: Nginx serving the static site + TinaCMS admin SPA
|
||||
FROM nginx:alpine AS frontend
|
||||
RUN rm /etc/nginx/conf.d/default.conf
|
||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
|
||||
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",
|
||||
"@tailwindcss/vite": "^4.2.4",
|
||||
"@tinacms/cli": "^2.1.2",
|
||||
"@tinacms/datalayer": "^2.0.18",
|
||||
"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",
|
||||
"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 { UsernamePasswordAuthJSProvider, TinaUserCollection } from "tinacms-authjs/dist/tinacms";
|
||||
|
||||
// Your TinaCMS configuration
|
||||
export default defineConfig({
|
||||
branch: process.env.TINA_BRANCH || "main",
|
||||
clientId: process.env.TINA_CLIENT_ID || "",
|
||||
token: process.env.TINA_TOKEN || "",
|
||||
contentApiUrlOverride: "/api/tina/gql",
|
||||
authProvider: new UsernamePasswordAuthJSProvider(),
|
||||
|
||||
build: {
|
||||
outputFolder: "admin",
|
||||
@@ -19,6 +18,7 @@ export default defineConfig({
|
||||
},
|
||||
schema: {
|
||||
collections: [
|
||||
TinaUserCollection,
|
||||
{
|
||||
name: "post",
|
||||
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