Compare commits
	
		
			3 commits
		
	
	
		
			main
			...
			feat/auth_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | a020bf5dca | ||
|   | e3d1386f6a | ||
|   | 4bd81f47dd | 
					 8 changed files with 102 additions and 3 deletions
				
			
		
							
								
								
									
										12
									
								
								.dockerignore
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.dockerignore
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| node_modules | ||||
| npm-debug.log | ||||
| .git | ||||
| .gitignore | ||||
| README.md | ||||
| .env | ||||
| .env.* | ||||
| .nyc_output | ||||
| coverage | ||||
| .vscode | ||||
| .DS_Store | ||||
| dist | ||||
							
								
								
									
										34
									
								
								Dockerfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Dockerfile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| # Multi-stage build for production | ||||
| FROM node:20-alpine AS build-stage | ||||
| 
 | ||||
| # Set working directory | ||||
| WORKDIR /app | ||||
| 
 | ||||
| # Copy package files | ||||
| COPY package*.json ./ | ||||
| 
 | ||||
| # Install dependencies | ||||
| #ENV NODE_ENV=production | ||||
| RUN npm ci --no-audit --no-fund | ||||
| 
 | ||||
| # Copy source code | ||||
| COPY . . | ||||
| 
 | ||||
| # Build the app | ||||
| RUN npm run build | ||||
| 
 | ||||
| # Production stage | ||||
| FROM nginx:stable-alpine AS production-stage | ||||
| 
 | ||||
| # Copy built assets from build stage | ||||
| COPY --from=build-stage /app/dist /usr/share/nginx/html | ||||
| 
 | ||||
| # Copy custom nginx config | ||||
| COPY nginx.conf /etc/nginx/nginx.conf | ||||
| 
 | ||||
| # Expose port 80 | ||||
| EXPOSE 80 | ||||
| 
 | ||||
| # Start nginx | ||||
| HEALTHCHECK --interval=30s --timeout=3s --retries=3 CMD wget -qO- http://localhost/healthz >/dev/null 2>&1 || exit 1 | ||||
| CMD ["nginx", "-g", "daemon off;"] | ||||
							
								
								
									
										49
									
								
								nginx.conf
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								nginx.conf
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,49 @@ | |||
| events { | ||||
|     worker_connections 1024; | ||||
| } | ||||
| 
 | ||||
| http { | ||||
|     include       /etc/nginx/mime.types; | ||||
|     default_type  application/octet-stream; | ||||
|     sendfile on; | ||||
|     etag on; | ||||
|     gzip on; | ||||
|     gzip_comp_level 5; | ||||
|     gzip_min_length 1024; | ||||
|     gzip_types | ||||
|         text/plain text/css application/json application/javascript | ||||
|         text/xml application/xml application/xml+rss image/svg+xml; | ||||
|      | ||||
|     server { | ||||
|         listen 80; | ||||
|         server_name _; | ||||
|         root /usr/share/nginx/html; | ||||
|         index index.html; | ||||
| 
 | ||||
|         add_header X-Content-Type-Options "nosniff" always; | ||||
|         add_header X-Frame-Options "DENY" always; | ||||
|         add_header Referrer-Policy "strict-origin-when-cross-origin" always; | ||||
|         add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; | ||||
|          | ||||
|         # Handle client-side routing | ||||
|         location / { | ||||
|             try_files $uri $uri/ /index.html; | ||||
|         } | ||||
| 
 | ||||
|         location = /index.html { | ||||
|             add_header Cache-Contrl "no-store, no-cache, must-revalidate"; | ||||
|             expires -1; | ||||
|         } | ||||
|          | ||||
|         # Cache static assets | ||||
|         location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { | ||||
|             expires 1y; | ||||
|             add_header Cache-Control "public, immutable"; | ||||
|         } | ||||
| 
 | ||||
|         location = healthz { | ||||
|             default_type text/plain; | ||||
|             return 200 'ok'; | ||||
|         } | ||||
|     } | ||||
| } | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.6 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 6.7 KiB | 
|  | @ -113,7 +113,7 @@ | |||
|         </div> | ||||
| 
 | ||||
|         <div class="signup-prompt"> | ||||
|           <p>Don't have an account? <a href="/signup" class="signup-link">Sign up</a></p> | ||||
|           <p>Don't have an account? <router-link to="/signup" class="signup-link">Sign up</router-link></p> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|  |  | |||
|  | @ -84,6 +84,7 @@ | |||
|                 :class="{ 'error': error && !email }" | ||||
|                 placeholder="Enter your email" | ||||
|                 required  | ||||
|                 autocomplete="email" | ||||
|               /> | ||||
|             </div> | ||||
|           </div> | ||||
|  | @ -100,6 +101,7 @@ | |||
|                 :class="{ 'error': error && !password }" | ||||
|                 placeholder="Create a password" | ||||
|                 required  | ||||
|                 autocomplete="new-password" | ||||
|               /> | ||||
|               <button  | ||||
|                 type="button"  | ||||
|  | @ -135,6 +137,7 @@ | |||
|                 :class="{ 'error': error && !confirmPassword || passwordMismatch }" | ||||
|                 placeholder="Confirm your password" | ||||
|                 required  | ||||
|                 autocomplete="new-password" | ||||
|               /> | ||||
|               <button  | ||||
|                 type="button"  | ||||
|  | @ -210,7 +213,7 @@ | |||
|         </div> | ||||
| 
 | ||||
|         <div class="login-prompt"> | ||||
|           <p>Already have an account? <a href="/login" class="login-link">Sign in</a></p> | ||||
|           <p>Already have an account? <router-link to="/login" class="login-link">Sign In</router-link></p> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|  | @ -277,6 +280,7 @@ export default { | |||
|       } | ||||
|     }, | ||||
|     isFormValid() { | ||||
|       const emailOk = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.email); | ||||
|       return this.firstName &&  | ||||
|              this.lastName &&  | ||||
|              this.username &&  | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| const { defineConfig } = require('@vue/cli-service') | ||||
| module.exports = defineConfig({ | ||||
|   transpileDependencies: true, | ||||
|   lintOnSave: true | ||||
|   lintOnSave: process.env.NODE_ENV !== 'production' | ||||
| }) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue