Direkt zum Inhalt

Softwareentwicklung mit Devin: Sicherheit, Einsatz, Wartung (Teil 4)

Lerne, wie du mit Devin echte Benutzerauthentifizierung mit NextAuth hinzufügst, Fehler mit Sentry überwachst und das Frontend mit Vorschau-URLs in Vercel bereitstellst.
Aktualisierte 26. Juni 2025  · 12 Min. Lesezeit

Willkommen zurück! Wir sind fast am Ziel: Slack zwitschert, Jira hat Tickets, die Tests sind grün und unser CI blockiert jeden schlampigen PR. Teil vier ist der letzte Schritt, mit dem wir den fp-ts Spielplatz in etwas verwandeln, auf das wir theoretisch die Öffentlichkeit aufmerksam machen können.

Du kannst alle Tutorials der Devin-Serie hier aufrufen:

  1. Einrichtung und erster Pull Request (Teil 1)
  2. Eine vertikale Scheibe mit Devin verschiffen (Teil 2)
  3. Integration, Tests und CI/CD (Teil 3) 
  4. Sicherheit, Einsatz, Wartung (Teil 4)

Hier ist der Plan für dieses vierte Tutorial:

  • Autor: Keine anonymen UUIDs mehr; wir werden NextAuth-Anmeldedaten, JWT-Cookies und einen GqlAuthGuard ein, damit der Fortschritt an echte Nutzer gebunden ist.
  • Die Augen auf die Produktion gerichtet: Eine Zeile Sentry-Code in der Web-App, eine in der Nest-API, und jede Ausnahme landet im Dashboard.
  • Einsatz auf Knopfdruck: Das Frontend geht auf Vercel mit Vorschau-URLs für jeden PR live. (Die API bleibt vorerst lokal, wir werden sie mit Docker nachbilden).

Wir werden auch über diese Paarprogrammierung mit Devin nachdenken und sehen, wo sie glänzt und wo ein Mensch noch mit losen Enden aufräumen muss, bevor die Welt das Repo sieht. Bereit für die letzte Etappe?

Von anonymen UUIDs zu echten Benutzern

Was ich Devin gebeten habe zu tun

Kurz gesagt, ich habe Devin gebeten, den anonymen UUID-Flow zu entfernen und mir einen echten Auth-Stack zu geben:

  • NextAuth v6 credentials provider in apps/web
  • NestJS AuthModule mit Argon2-Hashing und JWT-Cookies
  • Prisma-Migration, die eine Tabelle User hinzufügt und Progress.sessionIduserId (non-null) ändert
  • Kopiere alle vorhandenen UUID-Fortschrittszeilen auf einen Platzhalter-Benutzer, damit die Lernenden ihre Abzeichen behalten
  • Tausche Postgres nicht gegen SQLite

Was zurückkam (meistens gut)

Hier ist eine Zusammenfassung der Ergebnisse:

Layer

Devins Leistung

Datenbank

Die Tabelle Session wurde gestrichen und ein User Modell mit email, hash, Streufeldern und Zeitstempeln hinzugefügt. Das Migrationsskript füllte jede alte sessionId Zeile in einen Pseudo-Benutzer namens legacy-@anon.local zurück.

Backend

AuthModule, AuthService, GraphQL AuthResolver, JwtStrategy und eine GqlAuthGuard. Alles Nest-idiomatisch, 100 % getippt.

Frontend

AuthProvider React-Kontext, LoginForm, RegisterForm, ein Modal, das bei geschützten Routen erscheint, und eine Abmeldeschaltfläche in der Kopfzeile des Dashboards.

Sicherheit

Argon2 (12 Runden), DTO-Validierung über class-validator, JWTs, die in localStorage gespeichert sind, Wachen bei jedem Progress Resolver.

Tests

Einheitstest für AuthService.register/login und ein e2e-Mutationstest, der sicherstellt, dass der Guard fehlende Token zurückweist. (Forderte ihn ein zweites Mal auf, die Tests hinzuzufügen)

Eine weitere SQLite-Migration

Rate mal, was ich in Devins kleiner Denkbox wieder gesehen habe.

Erfolgreiche Migration von PostgreSQL zu SQLite für die lokale Entwicklung 🥳

Genau das, was ich ihm gesagt hatte, dass eres nicht tun soll. Das Prisma-Schema wurde für SQLite umgeschrieben und die Verbindungsstrings und -typen wurden geändert (von TIMESTAMP zu DATETIME). Ich habe es mitten in der Sitzung mitbekommen:

  1. Pausiere die Sitzung.
  2. git checkout main apps/api/prisma/schema.prisma (Postgres-Schema wiederherstellen).
  3. Lösche die neue dev.db Datei.
  4. npm run prisma:migrate --workspace=apps/api um Postgres-Migrationen erneut anzuwenden.
  5. nahm Devin wieder auf; er erkannte die Umkehr und fuhr ohne Beanstandung fort.

Schaden: 0,8 ACU und etwa zehn Minuten.

Veränderungs-Checkliste für Teammitglieder

Ich schätze die Anweisungen, die Devin in PRs gibt, sehr. Hier sollten wir es tun:

# 1  Install new deps
npm install --workspaces

# 2  Run the Postgres migration
npm run prisma:migrate --workspace=apps/api

# 3  Restart everything
npm run dev:api   &   npm run dev:web

Architektur-Schnappschuss

Im Wiki habe ich dieses hilfreiche Diagramm zu unserem neuen Autorisierungssystem gefunden:

Devins Diagramm für unser neues Autorisierungssystem

Jetzt, wo wir echte Nutzer haben und die Datenbank wieder auf Postgres basiert, sind wir endlich bereit, den Lernpfad zu verfolgen, Preview-Builds an Vercel zu senden und Laufzeitfehler mit Sentry zu erkennen.

Nachdem die sicheren Log-ins eingerichtet waren, war der nächste offensichtliche Meilenstein, der Welt etwas zum Anklicken zu zeigen. Wir haben uns entschieden, vorerst nur das Next.js Frontend einzusetzen. API und Postgres bleiben auf meinem lokalen Rechner, bis wir uns für einen Host entscheiden, der in unser Budget passt.

Manuelle Kontoeröffnung (0 ACUs)

Die Verbindung von Devin mit meinem persönlichen Vercel-Konto über native Integrationen ist noch nicht möglich. Also habe ich es manuell über das Vercel-Dashboard gemacht:

  1. Logge dich in Vercel ein und klicke auf "Neues Projekt → Git-Repository importieren".
  2. Wähle das fp-ts-exercises Repo aus, belasse den Build-Befehl auf npm run build --workspace apps/web und klicke auf Bereitstellen.
  3. Kopiere das Ergebnis VERCEL_PROJECT_ID und VERCEL_TOKEN in GitHub Secrets.

Lass Devin den CI-Workflow aktualisieren (0.4 ACU)

Auf meine Aufforderung hin fügte Devin am Ende des bestehenden Workflows einen einzelnen Job und einen kleinen Shell-Schritt hinzu, der die generierte URL an Slack weiterleitet:

- name: Deploy to Vercel
  if: ${{ success() && github.event_name == 'pull_request' }}
  run: npx vercel deploy --prod --token ${{ secrets.VERCEL_TOKEN }}
  env:
    VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
    VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

Ergebnis

Push einen Zweig → CI grün → Slack ping:

✅ Preview ready: https://fp-ts-exercises-git-my-branch.vercel.app

Wenn du den Link öffnest, siehst du unseren Spielplatz, den vollständigen Authentifizierungsfluss und das Dashboard der Lernenden. Auf Vercels Seite ist noch keine Anpassung der Umgebung erforderlich, da das Frontend über http://localhost:4000 mit meiner lokalen API kommuniziert.

Ein genauerer Blick auf Devins Geheimnissystem

Vor der Integration in Sentry habe ich mir Devins Geheimnissystem angesehen, um herauszufinden, ob ich es verwenden sollte. Devin bietet einen eingebauten "Secrets"-Tresor, damit du dem Agenten API-Schlüssel, DB-URLs oder OAuth-Tokens geben kannst, ohne sie in Git einzuchecken und ohne sie im Chat preiszugeben. Betrachte es als ein leichtes Äquivalent zu GitHub Actions secrets oder Vercels Environment Variables, aber auf Devins eigene Cloud Workspaces beschränkt.

Feature

Wie es funktioniert

Anmerkungen

Umfang

Secrets umfassen drei Bereiche: org, repo und session. 

Du kannst die Geheimnisse auf Organisationsebene für alle deine Sitzungen verfügbar machen. 

Wenn du Geheimnisse für ein einzelnes Repository hinzufügen möchtest, kannst du sie beim Einrichten deines Repositorys angeben.Wenn du möchtest, dass die Geheimnisse sitzungsspezifisch sind, kannst du sie in den Sitzungseinstellungen angeben. 

Verschlüsselung

Server-seitig mit AES-256 und TLS 1.3+ während der Übertragung gespeichert

Alle Kundendaten werden mit einem eigenen KMS-Schlüssel (Key Management Service) verschlüsselt, der von AWS verwaltet wird.

Keine ACU-Kosten

Das Hinzufügen, Bearbeiten oder Löschen eines Geheimnisses ist eine Aktion auf der Steuerungsebene: 0 ACUs. Nur für Aufgaben, die das Geheimnis verwenden, gibt es Rechenguthaben.

Ein guter Ort, um langlebige Spielsteine zu verstauen.

Zugang innerhalb von Prompts

Verwende $. in der Eingabeaufforderung oder in einem Befehl. Devin löst es auf, bevor er die Shell ausführt.

Beispiel: DATABASE_URL=$.POSTGRES_URL

Größenbeschränkungen

4 KB pro Schlüssel, 100 Schlüssel pro Team auf der Hauptstufe.

Das reicht für PEM-Zertifikate oder private Schlüssel.

Hinzufügen eines Geheimnisses

Hier sind die Schritte, die du befolgen musst, um ein Geheimnis hinzuzufügen:

  1. Öffne Team → Geheimnisse im Dashboard von Devin.
  2. Klicke auf "Geheimnis hinzufügen" und gib einen Namen (SENTRY_DSN_WEB ) und seinen Wert ein.
  3. Devin bestätigt die Speicherung; der Schlüssel ist jetzt als $.SENTRY_DSN_WEB verfügbar.

ein neues Geheimnis in devin speichern

Ein Geheimnis in einer Aufgabe verwenden

Aufgabe: API Sentry init aktualisieren; DSN setzen auf $SECRET.SENTRY_DSN_API

Devin ersetzt den Wert, wenn er main.ts schreibt. In der Shell-Registerkarte siehst du den eigentlichen DSN, aber das Chat-Protokoll verbirgt ihn.

Pro und Kontra

Vorteile:

  • Es besteht kein Risiko, dass Schlüssel in PRs oder Timelapse-Logs durchsickern.
  • Organisationsbezogene Geheimnisse funktionieren sitzungsübergreifend: ein Upload, viele Verwendungen.
  • Keine Kreditkosten zum Lagern oder Abholen.

Nachteile:

  • Die Schlüssel sind nicht lokal verfügbar, es sei denn, du kopierst sie in .env. Testläufe außerhalb von Devin müssen manuell eingerichtet werden.
  • Kein Scoping nach Umgebungen (z. B. "nur in der Produktion"). Alle Sitzungen erhalten alle Geheimnisse.

Wann man es benutzt

Ich finde es einfacher, Devins Tresor zu benutzen, wenn Devin selbst den Schlüssel braucht (z.B. beim Pushing nach Vercel, beim Zugriff auf eine private Registry oder beim Verdrahten von Sentry während des Builds). Ich würde weiterhin .env / GitHub Actions secrets für alles verwenden, was auch in deiner lokalen Dev-Shell oder CI-Runnern läuft.

Devin Integration mit Sentry

Hier ist die Aufforderung, die ich benutzt habe: Füge Sentry zu beiden Apps hinzu, damit jede Ausnahme in meinem Dashboard angezeigt wird. Verwende Umgebungsvariablen in .env. Kein anderes Verhalten ändert sich."

Devins Arbeit (0,6 ACU, eine Sitzung)

Hier ist eine Zusammenfassung des Ergebnisses:

Stack

Berührte Dateien

Schlüsselcode

Next.js (Web)

apps/web/sentry.client.config.tsx apps/web/sentry.server.config.ts und ein Import in app/layout.tsx

ts import * as Sentry from '@sentry/nextjs'; Sentry.init({ dsn: process.env.SENTRY_DSN_WEB, tracesSampleRate: 1.0 });

NestJS (API)

apps/api/src/sentry.ts und zwei Zeilen in main.ts

ts import * as Sentry from '@sentry/node'; Sentry.init({ dsn: process.env.SENTRY_DSN_API }); app.useGlobalFilters(new Sentry.GqlExceptionFilter());

Env Gerüst

Platzhalter hinzugefügt für .env.example

SENTRY_DSN_WEB=   SENTRY_DSN_API=

Tests

Ein Jest-Spion wurde hinzugefügt, um sicherzustellen, dass Sentry.captureException bei einem erzwungenen Fehler aufgerufen wird.

 

Meine manuellen Schritte

Hier sind die Schritte, die ich unternommen habe:

  1. Kopiere DSNs aus meinem Sentry-Projekt in .env.
  2. Habe beide Dev-Server neu gestartet.
  3. Rufe http://localhost:4000/graphql mit einer absichtlich schlechten Abfrage auf, um zu prüfen, ob sie funktioniert. Eine Ausgabe erschien innerhalb von Sekunden in Sentry.

Warum ich Devins Geheimnisse übersprungen habe

Deshalb habe ich Devins Beitrag über die Geheimnisse übersprungen:

  • Einfacheres mentales Modell: überall die gleiche .env Datei.
  • Es ist einfacher, Preview-Builds auf Vercel auszuführen (die Umgebungsvariablen sind dort bereits gesetzt).
  • Kein ACU-Brand für Geheimoperationen.

Reflektionen: Wo Devin glänzt und wo er stolpert

Vor vier Tutorials war dieses Repo ein verstaubter Haufen von fp-ts Übungen - jetzt ist es das:

  • Modernisierte Codebasis: Neueste Abhängigkeiten, strikte TS-Konfiguration, Lint & Prettier-Regeln (Teil 1).
  • Browserbasierter Spielplatz: Next.js 14 + Sandpack-Editor mit Live-Feedback von Vitest (Teil 2).
  • NestJS + Postgres Backend: GraphQL API, Prisma-Migrationen, anonyme → JWT-Lernpfade (Teil 2 & 4).
  • Grünes Licht für die Pipeline: CI-Workflow, der Linktests, Typprüfungen, Jest und Playwright ausführt und jeden fehlerhaften PR blockiert (Teil 3).
  • Teamintegrationen: Slack-Status-Pings, Jira-Label-Analyse und Vorschau-URLs für jeden Zweig (Teil 3).
  • Beobachtbarkeit der Produktion: Sentry ist sowohl mit dem Web als auch mit der API verbunden und erfasst jede Ausnahme (Teil 4).
  • Die Vorschau setztein: Vercel erstellt eine teilbare URL für jede Pull-Anfrage (Teil 4).

Wir haben etwa ≈ 70 ACUs insgesamt (~$157 für den Core-Plan) und etwa zwei Arbeitstage für die praktische Prüfung.

Was Devin erschreckend gut kann

Hier denke ich, dass Devin sehr gut ist:

Bereich

Warum es mich beeindruckt hat

Grundlegende Infrastruktur

AuthModule, Dockerfiles, YAML-Workflows: in wenigen Minuten erstellt, fehlerfrei.

Rahmen-idiomatischer Code

Die NestJS-Dekoratoren, die NextAuth-Konfiguration und die Prisma-Migrationen stimmen mit den offiziellen Dokumenten überein.

Testgerüst

Unit- und Playwright-Suites werden kompiliert und laufen direkt aus dem Gate - es fehlen keine Edge-Case-Stubs.

Wo ein Mensch den Agenten noch schlägt

Hier muss sich Devin meiner Meinung nach noch verbessern:

Schmerzpunkt

Beispiel

Schichtübergreifende Merkmale polieren

Der Sandpack-Editor ist fest auf Stub-Tests programmiert; er hat nicht gegriffen SandpackTests Name der Komponente.

Persistenz der Konfiguration

5 Mal zurück zu SQLite, auch nach dem ausdrücklichen Hinweis "Muss auf Postgres bleiben".

Benennung / Bereinigung

PR-Titel treiben, veraltete Dateien bleiben bestehen, wenn du Devin nicht sagst, dass er sie löschen soll.

Geschmack & UX

Das Dashboard sah passabel aus, aber die Abstände, Texte und Farben mussten noch überarbeitet werden.

Meine Meinung

Devins eigene Dokumente versprachen nie einen Product Builder. Sie umreißen einen viel engeren Sweet Spot, und im Nachhinein betrachtet, hätte ich darin bleiben sollen. Die offizielle "Was sind Devins Stärken?"-Seite listet vier Schlagzeilen auf:

Devin Stärken

In den Dokumenten wird die Entwicklung von Funktionen, die die Benutzeroberfläche, die API und den Datenfluss umfassen, als "experimentell" bezeichnet. Sie werden als große Aufgaben mit offenem Ende beschrieben, bei denen der Agent "eine umfangreiche menschliche Überprüfung und Iteration erfordert". Das ist genau das, was wir gesehen haben, als Sandpack Tests hart kodiert hat oder als das Dashboard zwar gut aussah, aber die Daten nicht wirklich berechnet hat.

Als Faustregel gilt also:

Verwende Devin für alles, was ein erfahrener Entwickler mit einem Skript automatisieren kann, und behalte das Lenkrad für Aufgaben, die ein Produktverständnis erfordern.

Fazit

Wir haben das Ende unseres vierteiligen Tutorials erreicht:

  1. Einrichtung und erster Pull Request (Teil 1)
  2. Eine vertikale Scheibe mit Devin verschiffen (Teil 2) 
  3. Integration, Tests und CI/CD (Teil 3) 
  4. Sicherheit, Einsatz, Wartung (Teil 4)

Hier sind ein paar nächste Schritte, die wir von hier aus unternehmen können:

  1. Hostet die API, damit Preview-Builds (und zukünftige Nutzer) auf ein echtes Backend treffen.
  2. Sicherstellen, dass die Kernfunktionen funktionieren und die 30 Bugs beheben, von denen ich weiß, dass sie da sind
  3. Poliere die Benutzeroberfläche
  4. Mehr Inhalte und Übungen hinzufügen
  5. Freigeben für Menschen zum Gebrauch!

Wenn du den gleichen Weg einschlägst, denk daran: Du kannst den Makler den Beton legen lassen, aber du musst das Haus trotzdem entwerfen. Viel Spaß beim Codieren!

Themen

Baue mit diesen Kursen KI-Agenten auf:

Kurs

Designing Agentic Systems with LangChain

3 Std.
4.2K
Get to grips with the foundational components of LangChain agents and build custom chat agents.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Der Blog

Die 50 besten AWS-Interview-Fragen und Antworten für 2025

Ein kompletter Leitfaden zur Erkundung der grundlegenden, mittleren und fortgeschrittenen AWS-Interviewfragen, zusammen mit Fragen, die auf realen Situationen basieren.

Zoumana Keita

15 Min.

Der Blog

Top 30 Generative KI Interview Fragen und Antworten für 2024

Dieser Blog bietet eine umfassende Sammlung von Fragen und Antworten zu generativen KI-Interviews, die von grundlegenden Konzepten bis hin zu fortgeschrittenen Themen reichen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Der Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Der Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 Min.

Der Blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates hat im zweiten Quartal 2023 über 20.000 Stipendien an unsere gemeinnützigen Partner vergeben. Erfahre, wie fleißige benachteiligte Lernende diese Chancen in lebensverändernde berufliche Erfolge verwandelt haben.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Der Blog

2022-2023 DataCamp Classrooms Jahresbericht

Zu Beginn des neuen Schuljahres ist DataCamp Classrooms motivierter denn je, das Lernen mit Daten zu demokratisieren. In den letzten 12 Monaten sind über 7.650 neue Klassenzimmer hinzugekommen.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 Min.

Mehr anzeigenMehr anzeigen