diff --git a/examples/fullstack/.devcontainer/devcontainer.json b/examples/fullstack/.devcontainer/devcontainer.json index f1ad5a7..81fa244 100644 --- a/examples/fullstack/.devcontainer/devcontainer.json +++ b/examples/fullstack/.devcontainer/devcontainer.json @@ -1,22 +1,15 @@ { "name": "Fullstack DevContainer", - "dockerComposeFile": ["../docker-compose.yml"], - "service": "frontend", + "dockerComposeFile": ["../compose.yml", "../compose.override.yml"], + "service": "backend", "workspaceFolder": "/app", "shutdownAction": "stopCompose", "forwardPorts": [80, 8080], - "settings": { - "terminal.integrated.defaultProfile.linux": "bash" - }, -"mounts": [ - "source=frontend_node_modules,target=/app/node_modules,type=volume", - "source=backend_node_modules,target=/backend/node_modules,type=volume", - "source=${localWorkspaceFolder}/backend,target=/backend,type=bind" -], -"postCreateCommand": "npm install && cd /backend && npm install", + "postCreateCommand": "/entrypoint.sh", "customizations": { "vscode": { "extensions": [ + "jripouteau.adonis-vscode-extension", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode" ] diff --git a/examples/fullstack/backend/Dockerfile b/examples/fullstack/backend/Dockerfile index 7bb2eae..00bbca4 100644 --- a/examples/fullstack/backend/Dockerfile +++ b/examples/fullstack/backend/Dockerfile @@ -4,14 +4,14 @@ HEALTHCHECK --interval=5s --timeout=10s --start-period=5s --retries=5 \ # All deps stage FROM base AS deps -WORKDIR /app +WORKDIR /app/backend ADD package.json package-lock.json ./ RUN npm ci FROM deps AS develop -WORKDIR /app +WORKDIR /app/backend COPY dev-entrypoint.sh /entrypoint.sh -COPY .env.example /app/.env +COPY .env.example /app/backend/.env RUN chmod +x /entrypoint.sh ENV NODE_ENV=development EXPOSE 3333 @@ -19,14 +19,14 @@ ENTRYPOINT [ "/entrypoint.sh" ] # Production only deps stage FROM base AS production-deps -WORKDIR /app +WORKDIR /app/backend ADD package.json package-lock.json ./ RUN npm ci --omit=dev # Build stage FROM base AS build -WORKDIR /app -COPY --from=deps /app/node_modules /app/node_modules +WORKDIR /app/backend +COPY --from=deps /app/backend/node_modules /app/backend/node_modules ADD . . RUN node ace build @@ -34,8 +34,8 @@ RUN node ace build FROM base ENV NODE_ENV=production WORKDIR /app -COPY --from=production-deps /app/node_modules /app/node_modules -COPY --from=build /app/build /app +COPY --from=production-deps /app/backend/node_modules /app/backend/node_modules +COPY --from=build /app/backend/build /app EXPOSE 8080 CMD ["node", "./bin/server.js"] diff --git a/examples/fullstack/backend/app/controllers/users_controller.ts b/examples/fullstack/backend/app/controllers/users_controller.ts index fffe658..15e696b 100644 --- a/examples/fullstack/backend/app/controllers/users_controller.ts +++ b/examples/fullstack/backend/app/controllers/users_controller.ts @@ -1,8 +1,8 @@ import type { HttpContext } from '@adonisjs/core/http' import User from '#models/user' export default class UsersController { - public async index({ request }: HttpContext) { - const page = request.input('page', 1) - return User.query().paginate(page) - } -} \ No newline at end of file + public async index({ request }: HttpContext) { + const page = request.input('page', 1) + return User.query().paginate(page) + } +} diff --git a/examples/fullstack/backend/dev-entrypoint.sh b/examples/fullstack/backend/dev-entrypoint.sh index 06ccf61..0f3d88c 100755 --- a/examples/fullstack/backend/dev-entrypoint.sh +++ b/examples/fullstack/backend/dev-entrypoint.sh @@ -1,5 +1,6 @@ #!/bin/sh +cd /app/backend echo "starting up..." node ace generate:key diff --git a/examples/fullstack/backend/start/routes.ts b/examples/fullstack/backend/start/routes.ts index 24e58cf..89a1053 100644 --- a/examples/fullstack/backend/start/routes.ts +++ b/examples/fullstack/backend/start/routes.ts @@ -8,10 +8,10 @@ */ import router from '@adonisjs/core/services/router' -import UsersController from '#controllers/users_controller' +const UsersController = () => import('#controllers/users_controller') router.get('users', [UsersController, 'index']) router.get('/', async () => { return { - hello: 'world', + hello: 'WORLD', } }) diff --git a/examples/fullstack/compose.override.yml b/examples/fullstack/compose.override.yml index f156c88..db10541 100644 --- a/examples/fullstack/compose.override.yml +++ b/examples/fullstack/compose.override.yml @@ -5,10 +5,13 @@ services: context: backend target: develop volumes: - - ./backend:/app - - node_modules:/app/node_modules + - ./backend:/app/backend/ + - node_modules:/app/backend/node_modules + - frontend_node_modules:/app/frontend/node_modules + - ./frontend/:/app/frontend/ depends_on: db: condition: service_healthy volumes: node_modules: {} + frontend_node_modules: {} diff --git a/examples/fullstack/compose.yml b/examples/fullstack/compose.yml index db1d2fc..3fdf2a7 100644 --- a/examples/fullstack/compose.yml +++ b/examples/fullstack/compose.yml @@ -6,8 +6,8 @@ services: context: ./frontend target: develop volumes: - - frontend_node_modules:/app/node_modules - - ./frontend/src:/app/src + - frontend_node_modules:/app/frontend/node_modules + - ./frontend/:/app/frontend/ labels: - "traefik.http.routers.app.rule=Host(`app.docker.localhost`)" reverse-proxy: diff --git a/examples/fullstack/frontend/Dockerfile b/examples/fullstack/frontend/Dockerfile index 0e9f2ae..0bfebab 100644 --- a/examples/fullstack/frontend/Dockerfile +++ b/examples/fullstack/frontend/Dockerfile @@ -1,5 +1,5 @@ FROM node:22-alpine AS base -WORKDIR /app +WORKDIR /app/frontend COPY package.json yarn.lock ./ RUN yarn install COPY . . @@ -12,5 +12,5 @@ EXPOSE 5173 ENTRYPOINT [ "yarn", "dev", "--host", "0.0.0.0" ] FROM nginx:alpine AS production -COPY --from=build /app/dist/ /usr/share/nginx/html +COPY --from=build /app/frontend/dist/ /usr/share/nginx/html ENTRYPOINT [ "nginx", "-g", "daemon off;" ] diff --git a/examples/fullstack/frontend/src/App.css b/examples/fullstack/frontend/src/App.css index b9d355d..c1d1abf 100644 --- a/examples/fullstack/frontend/src/App.css +++ b/examples/fullstack/frontend/src/App.css @@ -18,21 +18,6 @@ filter: drop-shadow(0 0 2em #61dafbaa); } -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - .card { padding: 2em; } diff --git a/examples/fullstack/frontend/src/App.tsx b/examples/fullstack/frontend/src/App.tsx index 16129e2..18a6ddb 100644 --- a/examples/fullstack/frontend/src/App.tsx +++ b/examples/fullstack/frontend/src/App.tsx @@ -1,7 +1,6 @@ import { useState, useEffect } from 'react' import reactLogo from './assets/react.svg' import dockerLogo from './assets/docker.svg' -import viteLogo from '/vite.svg' import './App.css' function App() { @@ -38,18 +37,15 @@ function App() { return ( <>
-