From c5479aa63fa6386e9876aa49aca2696dd62358d2 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Fri, 21 Nov 2025 19:38:32 +0100 Subject: [PATCH] try gitea actions for dart server Signed-off-by: Peter Siegmund --- .gitea/workflows/docker.yml | 28 +++++++++++++++++++ .gitignore | 1 + server/cinema/.dockerignore | 1 + server/cinema/bin/server.dart | 10 +++---- .../cinema/lib/feature/middlewares/cors.dart | 24 ++++++++++++++++ 5 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 .gitea/workflows/docker.yml create mode 100644 server/cinema/lib/feature/middlewares/cors.dart diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml new file mode 100644 index 0000000..3572a67 --- /dev/null +++ b/.gitea/workflows/docker.yml @@ -0,0 +1,28 @@ +name: Build and Push Multi-Arch Docker Image + +on: + push: + branches: + - main + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Gitea Registry + run: echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ secrets.DOMAIN }} -u ${{ secrets.REGISTRY_USER }} --password-stdin + + - name: Build and Push Multi-Arch Image + working-directory: ./server/cinema + run: | + docker buildx build \ + --platform linux/amd64,linux/arm64 \ + --dns=8.8.8.8 --dns=1.1.1.1 \ + -t ${{ secrets.DOMAIN }}/${{ secrets.OWNER }}/${{ secrets.REPO }}/server:latest \ + --push . diff --git a/.gitignore b/.gitignore index d953f8a..8cdd3a6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ **/.idea/libraries **/.idea/copilot.* +*.log diff --git a/server/cinema/.dockerignore b/server/cinema/.dockerignore index e9bab56..38b04e1 100644 --- a/server/cinema/.dockerignore +++ b/server/cinema/.dockerignore @@ -9,3 +9,4 @@ build/ .packages *.g.dart *.config.dart +assets/cache diff --git a/server/cinema/bin/server.dart b/server/cinema/bin/server.dart index ff18665..2b5c96f 100644 --- a/server/cinema/bin/server.dart +++ b/server/cinema/bin/server.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:cinema/feature/middlewares/cors.dart'; import 'package:cinema/feature/poster/data/repositories/image_loader.dart'; import 'package:cinema/feature/poster/data/services/poster.service.dart'; import 'package:cinema/feature/root/data/service/root.service.dart'; @@ -18,15 +19,12 @@ void main(List args) async { router.mount("/poster", getIt().router.call); router.mount("/", getIt().router.call); - // Configure a pipeline that logs requests. - final handler = Pipeline().addMiddleware(logRequests()).addHandler(router.call); - - // Use any available host or container IP (usually `0.0.0.0`). - final ip = InternetAddress.anyIPv4; + /// add middlewares (Logging, CORS) + final handler = Pipeline().addMiddleware(logRequests()).addMiddleware(cors()).addHandler(router.call); // For running in containers, we respect the PORT environment variable. final port = int.parse(Platform.environment['PORT'] ?? '3000'); - await io.serve(handler, ip, port, poweredByHeader: null).then((server) async { + await io.serve(handler, InternetAddress.anyIPv4, port, poweredByHeader: null).then((server) async { final bannerFile = File('banner.txt'); if (await bannerFile.exists()) { final banner = await bannerFile.readAsString(); diff --git a/server/cinema/lib/feature/middlewares/cors.dart b/server/cinema/lib/feature/middlewares/cors.dart new file mode 100644 index 0000000..2819386 --- /dev/null +++ b/server/cinema/lib/feature/middlewares/cors.dart @@ -0,0 +1,24 @@ +import 'package:shelf/shelf.dart'; + +Middleware cors() { + const corsHeaders = { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE', + 'Access-Control-Allow-Headers': 'Origin, Content-Type', + 'Access-Control-Max-Age': "600", + }; + + return createMiddleware( + requestHandler: (Request request) { + if (request.method == "OPTIONS") { + return Response.ok('', headers: corsHeaders); + } + return null; + }, + responseHandler: (Response response) { + final headers = Map.from(response.headers); + headers.addEntries(corsHeaders.entries.map((e) => MapEntry(e.key, e.value))); + return response.change(headers: headers); + }, + ); +}