Compare commits

...

15 commits

Author SHA1 Message Date
694c1f10dc ready to deploy
Some checks failed
Build and Push Docker Images / build (admin-dashboard) (push) Failing after 15s
Build and Push Docker Images / build (battleship) (push) Failing after 9s
Build and Push Docker Images / build (calculator) (push) Failing after 9s
Build and Push Docker Images / build (cv-project) (push) Failing after 9s
Build and Push Docker Images / build (inventory) (push) Failing after 10s
Build and Push Docker Images / build (library) (push) Failing after 10s
Build and Push Docker Images / build (messages) (push) Failing after 9s
Build and Push Docker Images / build (nodejs-mini-message-board) (push) Failing after 10s
Build and Push Docker Images / build (portfolio) (push) Failing after 9s
Build and Push Docker Images / build (restaurant) (push) Failing after 9s
Build and Push Docker Images / build (shopping-cart) (push) Failing after 9s
Build and Push Docker Images / build (signup_form) (push) Failing after 8s
Build and Push Docker Images / build (tictactoe) (push) Failing after 9s
Build and Push Docker Images / build (weather) (push) Failing after 9s
2025-05-03 00:14:04 +00:00
427e75b86a fix image location 2025-05-02 23:49:57 +00:00
62a504709b fixed' 2025-05-02 23:40:32 +00:00
7584f27018 fix the damn path issues 2025-05-02 23:32:33 +00:00
cec308167b fix: the state 2025-05-02 22:44:37 +00:00
4b1c77f275 back_to_that_state 2025-05-02 22:41:43 +00:00
98665c5b49 making the build fail 2025-05-02 22:34:30 +00:00
598dc03c0c fix ci 2025-05-02 17:35:18 +00:00
bae2e0749b ci: remove auth demo 2025-05-02 17:27:07 +00:00
ae2cfa6e99 ci: remove todo app 2025-05-02 17:21:39 +00:00
39a4f1c763 fix: remove cv 2025-05-02 17:20:06 +00:00
55f7b09c93 fix: dockerfile for restaurant 2025-05-02 17:17:20 +00:00
23d651a21f
Merge pull request #21 from smiggiddy/ai-fix-bad-dockerfiles
help ai fix its issues
2025-05-02 13:08:18 -04:00
606e7b9f6d help ai fix its issues 2025-05-02 17:07:42 +00:00
069e79cd22 remove the ai bad stuff 2025-05-02 17:04:57 +00:00
33 changed files with 431 additions and 249 deletions

61
.devops-context.md Normal file
View file

@ -0,0 +1,61 @@
# DevOps Context for Odin Code Projects
This file contains essential information about the DevOps setup for the Odin Code Projects. It helps the AI assistant (and any humans working on the project) understand the build, deployment, and infrastructure context.
## Build Process
* **GitHub Actions:** The build process is managed using GitHub Actions.
* **Workflow:** The primary workflow is defined in `.github/workflows/build.yml`.
* **Build Context:**
* For most projects, the build context when building is the root of the project.
* For the `restaurant` project, the build context for docker is the `restaurant/` folder, and the dockerfile is found at `restaurant/devops/Dockerfile`
* **Image Naming:** Images are named using the format `ghcr.io/<github_username>/odin-codeprojects/<project_name>:<tag>`. The tag is either `latest` or the first 8 characters of the commit hash.
* **Package files**: Most node projects have `package.json` and `package-lock.json` in the root, or in the `app/` folder.
* **Projects with package.json:**
* Battleship
* restaurant
* shopping-cart
* weather
* testing
* todo
## Deployment
* **Kubernetes:** The applications are deployed to a Kubernetes cluster.
* **Ingress**: All projects are exposed through ingress with the following settings.
* ingressClassName: traefik
* annotations:
* cert-manager.io/cluster-issuer: letsencrypt
* hosts:
* <project_name>.odin.thecodedom.com
* tls:
* hosts:
* <project_name>.odin.thecodedom.com
* secretName: <project_name>-tls
* **Ingress locations**: The ingress files are located at <project>/devops/<project>-ingress.yaml
* **ArgoCD**: Application files are located at deploy/chart/templates/<project>-application.yaml
## Tools and Automation
* **Firebase Studio:** Firebase Studio was used to help create the devops process. Instructed by Smiggiddy though.
* **CI/CD**: CI/CD is in place to build and test the code and deploy changes.
## Project List
* All projects in this list are part of the build pipeline and can be deployed.
- admin-dashboard
- auth-expressjs
- battleship
- calculator
- cv
- cv-project
- inventory
- library
- messages
- nodejs-mini-message-board
- portfolio
- restaurant
- shopping-cart
- signup_form
- tictactoe
- todo
- weather

View file

@ -15,10 +15,8 @@ jobs:
matrix:
project:
- admin-dashboard
- auth-expressjs
- battleship
- calculator
- cv
- cv-project
- inventory
- library
@ -29,7 +27,6 @@ jobs:
- shopping-cart
- signup_form
- tictactoe
- todo
- weather
steps:
- name: Checkout code
@ -48,13 +45,14 @@ jobs:
- name: Build and Push Docker Image
id: build-and-push
env:
IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/${{ matrix.project }}
IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/odin-codeprojects/${{ matrix.project }}
run: |
IMAGE_TAG_LATEST=$IMAGE_NAME:latest
# Check if the latest image exists in the registry
IMAGE_EXISTS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "https://ghcr.io/v2/${{ github.repository_owner }}/${{ matrix.project }}/manifests/latest")
if [ "$IMAGE_EXISTS" == "200" ]; then
echo "Latest image exists, checking for changes..."

40
README.md Normal file
View file

@ -0,0 +1,40 @@
# Odin Code Projects: A Full-Stack Development Journey
Welcome to my collection of projects, created during my journey through the world of full-stack web development! This repository showcases a variety of applications, each representing a step forward in my learning process. From mastering the fundamentals of HTML, CSS, and JavaScript to diving deep into modern frameworks like React and backend technologies like Node.js and Express.js, each project in this collection has been an exercise in growth.
## My Learning Journey
My journey began with the foundational building blocks of web development. I honed my skills in creating responsive and dynamic user interfaces with HTML, CSS, and vanilla JavaScript. As I progressed, I embraced the power of component-based architectures by diving into React, a leading JavaScript library for building user interfaces. This shift allowed me to create complex applications with manageable, reusable components.
On the backend, I explored Node.js and Express.js to build robust APIs and server-side logic. I learned how to connect to databases, manage data, and handle user authentication, adding essential server-side capabilities to my toolkit.
## DevOps in Action: Kubernetes Deployment
Beyond crafting code, I've also focused on the crucial aspect of deployment and infrastructure. Leveraging my expertise in DevOps, I've deployed each of these projects to a Kubernetes cluster. This has provided me with hands-on experience managing containerized applications, handling scaling, and ensuring reliability in a production-like environment.
## Automation with Gemini and Firebase Studio
To enhance my workflow and automate the deployment process, I integrated cutting-edge tools like Google's Gemini and Firebase Studio. Gemini assisted me in rapidly generating deployment code snippets. As I want to continue learning more about AI, I'm using it to speed up tasks that may take longer.
## Project Showcase
Here are the projects that make up this collection, each showcasing different aspects of my full-stack development skills:
* [Admin Dashboard](admin-dashboard.odin.thecodedom.com)
* [Battleship](battleship.odin.thecodedom.com)
* [Calculator](calculator.odin.thecodedom.com)
* [CV Project](cv-project.odin.thecodedom.com)
* [Inventory](inventory.odin.thecodedom.com)
* [Library](library.odin.thecodedom.com)
* [Messages](messages.odin.thecodedom.com)
* [Node.js Mini Message Board](nodejs-mini-message-board.odin.thecodedom.com)
* [Portfolio](portfolio.odin.thecodedom.com)
* [Restaurant](restaurant.odin.thecodedom.com)
* [Shopping Cart](shopping-cart.odin.thecodedom.com)
* [Signup Form](signup-form.odin.thecodedom.com)
* [Tic Tac Toe](tictactoe.odin.thecodedom.com)
* [Weather](weather.odin.thecodedom.com)
Each project has it's own folder and it's own documentation, so you can dive deeper into each project.
This journey has been a challenging, yet incredibly rewarding experience. I hope you enjoy exploring these projects as much as I enjoyed creating them!

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: admin-dashboard-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: admin-dashboard.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: admin-dashboard-service
port:
number: 80
tls:
- hosts:
- admin-dashboard.odin.thecodedom.com
secretName: admin-dashboard-tls

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: battleship-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: battleship.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: battleship-service
port:
number: 80
tls:
- hosts:
- battleship.odin.thecodedom.com
secretName: battleship-tls

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: calculator-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: calculator.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: calculator-service
port:
number: 80
tls:
- hosts:
- calculator.odin.thecodedom.com
secretName: calculator-tls

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cv-project-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: cv-project.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cv-project-service
port:
number: 80
tls:
- hosts:
- cv-project.odin.thecodedom.com
secretName: cv-project-tls

View file

@ -20,7 +20,7 @@ function App() {
const [educationInfo, setEducationInfo] = useState([
{
schoolName: "Bowie State University",
graduationDatehttps://github.com/smiggiddy/odin-codeprojects/pull/18/conflict?name=cv-project%252Fsrc%252FApp.jsx&base_oid=7801fda840d1fa1854f23ddac31c617c382a3d13&head_oid=d00749cafbac7d5524c928f28cbb5b81e06b608e: "2020",
graduationDate: "2020",
fieldOfStudy: "Computer Technology: Network Security",
},
]);

View file

@ -1,30 +0,0 @@
# CV Project
This project is a web application designed to display a curriculum vitae (CV) or resume. It's built using HTML, CSS, and JavaScript to provide a dynamic and interactive presentation of personal and professional information.
## Project Structure
- `index.html`: The main HTML file that structures the web page content.
- `css/style.css`: The stylesheet used to visually format the CV.
- `js/script.js`: Contains JavaScript code for interactive elements and functionality.
- `assets/`: This folder contains the compiled production react code.
- `icon.svg`: The icon for the project.
- `vite.svg`: The vite logo used in the project.
## Running the Project Locally
To view and run this CV project on your local machine, follow these steps:
1. **Clone the Repository**
If you haven't already, clone the project repository to your local machine using git.
2. **Open `index.html`**
Navigate to the project directory in your file explorer and double-click on the `index.html` file. This will open the CV in your default web browser.
## Project Overview
This project provides a clean and modern way to present a CV online. It leverages web technologies to create a visually appealing and functional document.
## Additional Notes
- No specific server setup is required to run this project locally, as it is primarily a client-side application.
- All dependencies and code are self-contained within the project directory.

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
.input{display:flex;flex-direction:column;font-size:1.3rem;line-height:1.3;font-family:Inter Tight,sans-serif;font-optical-sizing:auto;font-style:normal}.input label{padding:10px 0 5px;font-size:1rem}.input input{font-size:1.1rem;padding:.5rem;border-radius:.4rem;outline:1px solid hsl(var(--light-gray));border:none}.input input:focus{outline:2px solid hsl(var(--dark-gray))}:root{--lightest-gray: 208, 21%, 93%;--lighter-gray: 210, 16%, 76%;--light-gray: 208, 12%, 58%;--dark-gray: 207, 12%, 43%;--darker-gray: 209, 15%, 28%;--dark-blue: 246, 87%, 30%;--blue: 219, 100%, 57%;--light-blue: 219, 100%, 69%;--green: 158, 95%, 34%;--green-hover: 158, 95%, 28%}.btn{border-radius:.4rem;padding:1rem;cursor:pointer;text-decoration:none;display:inline-block;border:none;font-size:1.2rem;flex:1}.normal-btn{background-color:hsl(var(--light-gray));transition:background-color .5s ease-in-out,color .5s ease-in-out}.normal-btn:hover{background-color:hsl(var(--dark-gray));color:hsl(var(--lighter-gray))}.submit-btn{background-color:hsl(var(--green));transition:background-color .6s}.submit-btn:hover{background-color:hsl(var(--green-hover))}.clear-btn{background-color:hsl(var(--lighter-gray));transition:background-color .6s}.clear-btn:hover{background-color:hsl(var(--light-gray))}:root{--font-size: 16px;--default-border-radius: .5rem;--default-shadow: 0 4px 6px hsla(0, 0%, 0%, .2);--small-shadow: 0 1px 3px hsla(0, 0%, 0%, .2);--large-shadow: 0 15px 35px hsla(0, 0%, 0%, .2);--tight-shadow: 0 4px 6px rgba(0, 0, 0, .3);--wide-shadow: 0 5px 15px rgba(0, 0, 0, .15);--lightest-gray: 208, 21%, 93%;--lighter-gray: 210, 16%, 76%;--light-gray: 208, 12%, 58%;--dark-gray: 207, 12%, 43%;--darker-gray: 209, 15%, 28%;--white-color: 360, 100%, 100%}html,body{padding:0;margin:0;font-size:var(--font-size);background:hsl(var(--lightest-gray))}textarea{resize:none}.container{display:flex;justify-content:center;padding:24px;gap:30px}.resume{display:flex;flex-direction:column;min-width:800px;max-width:850px;background:#fff;font-family:Playfair Display,serif;font-optical-sizing:auto;font-style:normal}.form{max-width:450px;min-width:400px}.general-info-form{padding:20px;margin-bottom:1rem;border-radius:var(--default-border-radius);box-shadow:var(--tight-shadow),var(--wide-shadow);background:hsl(var(--white-color))}.general-info-header{font-family:Inter Tight,sans-serif;font-optical-sizing:auto;font-weight:700;font-style:normal}.basic-info{display:flex;flex-direction:column;align-items:center}.basic-info p{padding:0;margin:0}.basic-info-details{display:flex;gap:1rem}.education-info-form,.job-info-form{padding:20px;margin-bottom:1rem;background:hsl(var(--white-color));border-radius:var(--default-border-radius)}.education-info{display:flex;flex-direction:column;justify-content:center}.education-info>h2,.job-info>h2{align-self:center;width:100%;display:inline-block;text-align:center;background-color:hsl(var(--lighter-gray))}.education-item{padding:10px 25px}.education-item h2,p{padding:0;margin:0}.btn-group{display:flex;justify-content:center;margin:30px 0 20px;gap:10px}.job{padding:1rem}.job-details{display:flex;align-items:baseline;justify-content:space-between}.job-details>h2{margin-bottom:0;padding-bottom:0}.job-dates{padding:0}.job-title{margin-top:0}

View file

@ -1 +0,0 @@
.input{display:flex;flex-direction:column;font-size:1.3rem;line-height:1.3;font-family:Inter Tight,sans-serif;font-optical-sizing:auto;font-style:normal}.input label{padding:10px 0 5px;font-size:1rem}.input input{font-size:1.1rem;padding:.5rem;border-radius:.4rem;outline:1px solid hsl(var(--light-gray));border:none}.input input:focus{outline:2px solid hsl(var(--dark-gray))}:root{--lightest-gray: 208, 21%, 93%;--lighter-gray: 210, 16%, 76%;--light-gray: 208, 12%, 58%;--dark-gray: 207, 12%, 43%;--darker-gray: 209, 15%, 28%;--dark-blue: 246, 87%, 30%;--blue: 219, 100%, 57%;--light-blue: 219, 100%, 69%;--green: 158, 95%, 34%;--green-hover: 158, 95%, 28%}.btn{border-radius:.4rem;padding:1rem;cursor:pointer;text-decoration:none;display:inline-block;border:none;font-size:1.2rem;flex:1}.normal-btn{background-color:hsl(var(--light-gray));transition:background-color .5s ease-in-out,color .5s ease-in-out}.normal-btn:hover{background-color:hsl(var(--dark-gray));color:hsl(var(--lighter-gray))}.submit-btn{background-color:hsl(var(--green));transition:background-color .6s}.submit-btn:hover{background-color:hsl(var(--green-hover))}.clear-btn{background-color:hsl(var(--lighter-gray));transition:background-color .6s}.clear-btn:hover{background-color:hsl(var(--light-gray))}:root{--font-size: 16px;--default-border-radius: .5rem;--default-shadow: 0 4px 6px hsla(0, 0%, 0%, .2);--small-shadow: 0 1px 3px hsla(0, 0%, 0%, .2);--large-shadow: 0 15px 35px hsla(0, 0%, 0%, .2);--tight-shadow: 0 4px 6px rgba(0, 0, 0, .3);--wide-shadow: 0 5px 15px rgba(0, 0, 0, .15);--lightest-gray: 208, 21%, 93%;--lighter-gray: 210, 16%, 76%;--light-gray: 208, 12%, 58%;--dark-gray: 207, 12%, 43%;--darker-gray: 209, 15%, 28%;--white-color: 360, 100%, 100%}html,body{padding:0;margin:0;font-size:var(--font-size);background:hsl(var(--lightest-gray))}textarea{resize:none}.container{display:flex;justify-content:center;padding:24px;gap:30px}.resume{display:flex;flex-direction:column;min-width:800px;max-width:850px;background:#fff;font-family:Playfair Display,serif;font-optical-sizing:auto;font-style:normal;min-height:90vh}.form{max-width:450px;min-width:400px}.general-info-form{padding:20px;margin-bottom:1rem;border-radius:var(--default-border-radius);box-shadow:var(--tight-shadow),var(--wide-shadow);background:hsl(var(--white-color))}.general-info-header{font-family:Inter Tight,sans-serif;font-optical-sizing:auto;font-weight:700;font-style:normal}.basic-info{display:flex;flex-direction:column;align-items:center}.basic-info p{padding:0;margin:0}.basic-info-details{display:flex;gap:1rem}.education-info-form,.job-info-form{padding:20px;margin-bottom:1rem;background:hsl(var(--white-color));border-radius:var(--default-border-radius)}.education-info{display:flex;flex-direction:column;justify-content:center}.education-info>h2,.job-info>h2{align-self:center;width:100%;display:inline-block;text-align:center;background-color:hsl(var(--lighter-gray))}.education-item{padding:10px 25px}.education-item h2,p{padding:0;margin:0}.btn-group{display:flex;justify-content:center;margin:30px 0 20px;gap:10px}.job{padding:1rem}.job-details{display:flex;align-items:baseline;justify-content:space-between}.job-details>h2{margin-bottom:0;padding-bottom:0}.job-dates{padding:0}.job-title{margin-top:0}

File diff suppressed because one or more lines are too long

View file

@ -1,16 +0,0 @@
# Use an official Nginx image as the base image
FROM nginx:latest
# Set the working directory to /app
WORKDIR /app
# Copy the HTML, CSS, and JavaScript files to the Nginx default directory
COPY index.html /usr/share/nginx/html/
COPY css/ /usr/share/nginx/html/css/
COPY assets/ /usr/share/nginx/html/assets/
# Expose port 80 to the outside world
EXPOSE 80
# Start Nginx
CMD ["nginx", "-g", "daemon off;"]

View file

@ -1,32 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: cv-deployment
spec:
replicas: 1
selector:
matchLabels:
app: cv
template:
metadata:
labels:
app: cv
spec:
containers:
- name: cv-app
image: ghcr.io/smiggiddy/odin-codeprojects/cv:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: cv-service
spec:
type: LoadBalancer
selector:
app: cv
ports:
- protocol: TCP
port: 80
targetPort: 80

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Creator: CorelDRAW -->
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="6.82666in" height="6.82666in" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
viewBox="0 0 6.82666 6.82666"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
<![CDATA[
.fil0 {fill:#00838F}
.fil1 {fill:#FFFFFE}
]]>
</style>
</defs>
<g id="Layer_x0020_1">
<metadata id="CorelCorpID_0Corel-Layer"/>
<rect class="fil0" width="6.82666" height="6.82666" rx="0.853335" ry="0.853335"/>
<path class="fil1" d="M1.57333 0.853331l2.50201 0 0 1.07132c0,0.117783 0.0955591,0.213335 0.213335,0.213335l1.07132 0 0 3.72868c0,0.0589094 -0.0477598,0.106669 -0.106669,0.106669l-3.68 0c-0.0589094,0 -0.106669,-0.0477598 -0.106669,-0.106669l0 -4.90667c0,-0.0589094 0.0477598,-0.106669 0.106669,-0.106669zm0.454803 3.27876l2.77039 0 0 0.16 -2.77039 0 0 -0.16zm0 -0.549039l2.77039 0 0 0.16 -2.77039 0 0 -0.16zm0 1.09808l2.77039 0 0 0.16 -2.77039 0 0 -0.16zm0.587961 -1.95123l-0.000125984 0 -0.000208661 -3.93701e-006c-0.0703898,-9.05512e-005 -0.154894,-0.0288425 -0.219433,-0.0911181 -0.0515433,-0.0497362 -0.0905236,-0.120382 -0.0996063,-0.214114 -0.000669291,-0.00694488 -0.00119685,-0.0189764 -0.00158661,-0.0319843 -0.000527559,-0.0173701 -0.000846457,-0.0384528 -0.00092126,-0.0485945 -0.000937008,-0.120929 0.0381024,-0.199823 0.0997756,-0.249929 0.0600276,-0.0487717 0.138654,-0.0666969 0.22098,-0.0683189l-3.93701e-006 -0.000212598c0.00254331,-4.72441e-005 0.00503937,6.69291e-005 0.00749606,0.000338583 0.0804252,0.00227559 0.156992,0.0204606 0.21574,0.0681929 0.0616693,0.0501063 0.100713,0.129 0.0997756,0.249929 -7.48031e-005,0.0101417 -0.000393701,0.0312244 -0.00092126,0.0485945 -0.000389764,0.0130079 -0.000917323,0.0250394 -0.00158661,0.0319843 -0.00933858,0.0964055 -0.0452638,0.167114 -0.0964961,0.216543 -0.0598307,0.0577323 -0.138949,0.0845591 -0.220134,0.0884646l3.93701e-006 0.000161417c-0.000917323,4.33071e-005 -0.00183465,6.29921e-005 -0.00274803,6.29921e-005l0 3.93701e-006zm-0.332898 -0.148165c-0.0673898,0.0380433 -0.125425,0.0945 -0.169031,0.163516 -0.0540433,0.0855197 -0.0860315,0.190409 -0.0860315,0.303114l0 0.00848425c0,0.0369843 0.0135039,0.0711378 0.0352559,0.0963661 0.0236535,0.027437 0.0569173,0.0444724 0.0940787,0.0444724l0.917248 0c0.0371654,0 0.0704291,-0.0170354 0.0940827,-0.0444724 0.021752,-0.0252283 0.0352559,-0.0593819 0.0352559,-0.0963661l0 -0.00848425c0,-0.111921 -0.0314685,-0.216047 -0.084689,-0.301106 -0.0433189,-0.0692283 -0.101094,-0.125965 -0.168256,-0.164362 -0.0178898,0.0364921 -0.0417008,0.0701181 -0.0722795,0.099622 -0.182717,0.176307 -0.481524,0.120043 -0.595634,-0.100783zm2.00548 -0.550413c-0.0589094,0 -0.106669,-0.0477598 -0.106669,-0.106669l0 -0.963776c0,-0.0594173 0.0470197,-0.107543 0.106669,-0.107543 0.0297913,0 0.0567205,0.0122165 0.0760748,0.0319094l0.963992 0.963992 7.87402e-006 -7.87402e-006c0.0416535,0.0416535 0.0416535,0.109197 0,0.15085 -0.0208268,0.0208268 -0.048126,0.0312441 -0.0754252,0.0312402l-0.96465 3.93701e-006zm-0.876791 1.04056l1.37377 0 0 0.16 -1.37377 0 0 -0.16zm0.495374 -0.379024l0.143441 0.0454213c-0.0220276,0.0800906 -0.0585748,0.139512 -0.109799,0.178445 -0.0510591,0.0387638 -0.116118,0.0582283 -0.194839,0.0582283 -0.0973346,0 -0.177421,-0.0332953 -0.240087,-0.0997205 -0.0626732,-0.0665945 -0.0940906,-0.157614 -0.0940906,-0.272878 0,-0.122091 0.0315906,-0.216866 0.0946024,-0.284484 0.0630079,-0.0674528 0.145827,-0.101264 0.248626,-0.101264 0.0896457,0 0.162563,0.0264685 0.218571,0.0795787 0.0334685,0.031248 0.0584016,0.0763268 0.0751378,0.135067l-0.146685 0.0350039c-0.00853543,-0.0380787 -0.0266378,-0.0681299 -0.0542992,-0.0901575 -0.0274961,-0.0220276 -0.0609646,-0.0329567 -0.10024,-0.0329567 -0.0542992,0 -0.0985276,0.0194685 -0.132339,0.0585709 -0.033811,0.0389331 -0.0507165,0.102114 -0.0507165,0.189543 0,0.0927244 0.0165669,0.158807 0.0500315,0.198083 0.0332992,0.0394488 0.0766772,0.0590827 0.129953,0.0590827 0.0394449,0 0.073252,-0.0124646 0.101598,-0.037563 0.0283504,-0.024937 0.0486693,-0.0643819 0.0611339,-0.118zm0.457642 0.26963l-0.262118 -0.733413 0.160685 0 0.185445 0.542846 0.179642 -0.542846 0.157098 0 -0.26263 0.733413 -0.158122 0z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -1,25 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/odin-codeprojects/cv/icon.svg" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter+Tight:ital,wght@0,100..900;1,100..900&display=swap"
rel="stylesheet"
/>
<link
href="https://fonts.googleapis.com/css2?family=Inter+Tight:ital,wght@0,100..900;1,100..900&family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap"
rel="stylesheet"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CV-Creator</title>
<script type="module" crossorigin src="/odin-codeprojects/cv/assets/index-Xi3UETwU.js"></script>
<link rel="stylesheet" crossorigin href="/odin-codeprojects/cv/assets/index-Czg_N-13.css">
</head>
<body>
<div id="root"></div>
</body>
</html>

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -1,18 +0,0 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: cv # Updated to match instruction
namespace: argocd
spec:
project: default
source:
repoURL: {{ .Values.repoUrl }} # Updated to match instruction
path: cv/devops
targetRevision: {{ .Values.targetRevision }} # Updated to match instruction
destination:
server: {{ .Values.targetServer }}
namespace: {{ .Values.targetNamespace }} # Updated to match instruction
syncPolicy:
automated:
prune: true
selfHeal: true

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: inventory-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: inventory.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: inventory-service
port:
number: 80
tls:
- hosts:
- inventory.odin.thecodedom.com
secretName: inventory-tls

View file

@ -1,12 +1,6 @@
# Use an official Nginx image as the base image
FROM nginx:latest
# Remove default Nginx configuration
RUN rm /etc/nginx/conf.d/default.conf
# Copy custom Nginx configuration
COPY nginx.conf /etc/nginx/conf.d
# Set the working directory in the container
WORKDIR /usr/share/nginx/html

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: library-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: library.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: library-service
port:
number: 80
tls:
- hosts:
- library.odin.thecodedom.com
secretName: library-tls

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: messages-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: messages.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: messages-service
port:
number: 80
tls:
- hosts:
- messages.odin.thecodedom.com
secretName: messages-tls

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nodejs-mini-message-board-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: nodejs-mini-message-board.odin.thecodedom.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nodejs-mini-message-board-service
port:
number: 3000
tls:
- hosts:
- nodejs-mini-message-board.odin.thecodedom.com
secretName: nodejs-mini-message-board-tls

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: portfolio-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: portfolio.odin.thecodedom.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: portfolio-service
port:
number: 80
tls:
- hosts:
- portfolio.odin.thecodedom.com
secretName: portfolio-tls

View file

@ -4,17 +4,14 @@ FROM node:18-alpine AS builder
# Set the working directory
WORKDIR /app
# Copy package.json and package-lock.json (if present)
COPY package*.json ./
# Copy package files
COPY app .
# Install dependencies
RUN npm install
# Copy the rest of the application code
COPY . .
# Build the application using webpack
RUN npm run build -- --config app/webpack.config.js
# Build the application
RUN npm run build -- --config ./webpack.config.js
# Use an Nginx base image to serve the static files
FROM nginx:alpine

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: restaurant-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: restaurant.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: restaurant-service
port:
number: 80
tls:
- hosts:
- restaurant.odin.thecodedom.com
secretName: restaurant-tls

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shopping-cart-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: shopping-cart.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: shopping-cart-service
port:
number: 80
tls:
- hosts:
- shopping-cart.odin.thecodedom.com
secretName: shopping-cart-tls

View file

@ -7,9 +7,6 @@ WORKDIR /app
# Copy the HTML, CSS, and JavaScript files from the current directory to /app
COPY . /app
# Copy the Nginx configuration file to /etc/nginx/conf.d/
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
# Expose port 80 for HTTP traffic
EXPOSE 80

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: signup-form-ingress
spec:
ingressClassName: traefik
rules:
- host: signup-form.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: signup-form-service
port:
number: 80
tls:
- hosts:
- signup-form.odin.thecodedom.com
secretName: signup-form-tls
annotations:
cert-manager.io/cluster-issuer: letsencrypt

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tictactoe-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: tictactoe.odin.thecodedom.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: tictactoe-service
port:
number: 80
tls:
- hosts:
- tictactoe.odin.thecodedom.com
secretName: tictactoe-tls

View file

@ -28,9 +28,6 @@ RUN rm -rf ./*
# Copy static files from the builder stage
COPY --from=builder /app/dist .
# Copy the nginx configuration file
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
# Expose port 80
EXPOSE 80

View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: weather-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: weather.odin.thecodedom.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: weather-service
port:
number: 80
tls:
- hosts:
- weather.odin.thecodedom.com
secretName: weather-tls