mirror of
https://gitea.smigz.com/smiggiddy/odin-codeprojects.git
synced 2025-06-27 11:20:40 -04:00
Compare commits
15 commits
7c3cf4c5c9
...
694c1f10dc
Author | SHA1 | Date | |
---|---|---|---|
694c1f10dc | |||
427e75b86a | |||
62a504709b | |||
7584f27018 | |||
cec308167b | |||
4b1c77f275 | |||
98665c5b49 | |||
598dc03c0c | |||
bae2e0749b | |||
ae2cfa6e99 | |||
39a4f1c763 | |||
55f7b09c93 | |||
23d651a21f | |||
606e7b9f6d | |||
069e79cd22 |
33 changed files with 431 additions and 249 deletions
61
.devops-context.md
Normal file
61
.devops-context.md
Normal 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
|
6
.github/workflows/build.yml
vendored
6
.github/workflows/build.yml
vendored
|
@ -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
40
README.md
Normal 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!
|
23
admin-dashboard/devops/admin-dashboard-ingress.yaml
Normal file
23
admin-dashboard/devops/admin-dashboard-ingress.yaml
Normal 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
|
23
battleship/devops/battleship-ingress.yaml
Normal file
23
battleship/devops/battleship-ingress.yaml
Normal 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
|
23
calculator/devops/calculator-ingress.yaml
Normal file
23
calculator/devops/calculator-ingress.yaml
Normal 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
|
23
cv-project/devops/cv-project-ingress.yaml
Normal file
23
cv-project/devops/cv-project-ingress.yaml
Normal 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
|
|
@ -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",
|
||||
},
|
||||
]);
|
||||
|
|
30
cv/README.md
30
cv/README.md
|
@ -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
|
@ -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}
|
|
@ -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
|
@ -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;"]
|
|
@ -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
|
20
cv/icon.svg
20
cv/icon.svg
|
@ -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 |
|
@ -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>
|
|
@ -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 |
|
@ -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
|
23
inventory/devops/inventory-ingress.yaml
Normal file
23
inventory/devops/inventory-ingress.yaml
Normal 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
|
|
@ -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
|
||||
|
||||
|
|
23
library/devops/library-ingress.yaml
Normal file
23
library/devops/library-ingress.yaml
Normal 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
|
23
messages/devops/messages-ingress.yaml
Normal file
23
messages/devops/messages-ingress.yaml
Normal 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
|
|
@ -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
|
23
portfolio/devops/portfolio-ingress.yaml
Normal file
23
portfolio/devops/portfolio-ingress.yaml
Normal 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
|
|
@ -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
|
||||
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
|
||||
|
|
23
restaurant/devops/restaurant-ingress.yaml
Normal file
23
restaurant/devops/restaurant-ingress.yaml
Normal 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
|
23
shopping-cart/devops/shopping-cart-ingress.yaml
Normal file
23
shopping-cart/devops/shopping-cart-ingress.yaml
Normal 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
|
|
@ -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
|
||||
|
||||
|
|
23
signup_form/devops/signup_form-ingress.yaml
Normal file
23
signup_form/devops/signup_form-ingress.yaml
Normal 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
|
23
tictactoe/devops/tictactoe-ingress.yaml
Normal file
23
tictactoe/devops/tictactoe-ingress.yaml
Normal 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
|
|
@ -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
|
||||
|
||||
|
|
23
weather/devops/weather-ingress.yaml
Normal file
23
weather/devops/weather-ingress.yaml
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue