commit 475a8b36a11b7bc652e2322c9fcc65df27e7c945 Author: Mike Nolan Date: Thu May 7 22:47:12 2026 -0500 First commit diff --git a/.gitea/workflows/work.yaml b/.gitea/workflows/work.yaml new file mode 100644 index 0000000..63f6523 --- /dev/null +++ b/.gitea/workflows/work.yaml @@ -0,0 +1,35 @@ +name: Build tesses.net +run-name: ${{ gitea.actor }} is building tesses.net 🚀 +on: [push] + +env: + GITEA_DOMAIN: git.tesses.org + GITEA_REGISTRY_USER: tesses50 + RESULT_IMAGE_NAME: tesses50/tessesdotnet + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Log in to registry + uses: docker/login-action@v3 + with: + registry: ${{ env.GITEA_DOMAIN }} + username: ${{ env.GITEA_REGISTRY_USER }} + password: ${{ secrets.PACKAGE_AND_BREW }} + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + push: true + tags: ${{ env.GITEA_DOMAIN }}/${{ env.RESULT_IMAGE_NAME }}:latest + - name: Deploy to cluster + uses: steebchen/kubectl@v2.0.0 + with: + config: ${{ secrets.KUBECONFIG }} + command: apply -f kubernetes \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d4a6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin +obj \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4cf90d9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM git.tesses.org/tesses50/crosslang-withshell:latest AS build + +COPY . /src + +WORKDIR /src + +RUN crosslang build + +FROM git.tesses.org/tesses50/crosslang:latest + +COPY --from=build /src/bin/TessesNet-1.0.0.0-prod.crvm /TessesNet.crvm + +ENTRYPOINT ["/usr/bin/env", "crossvm", "/TessesNet.crvm"] diff --git a/cross.json b/cross.json new file mode 100644 index 0000000..a248690 --- /dev/null +++ b/cross.json @@ -0,0 +1,8 @@ +{ + "$schema": "https:\/\/crosslang.tesseslanguage.com\/\/schema\/cross-json-schema.json", + "info": { + "type": "console" + }, + "name": "TessesNet", + "version": "1.0.0.0-prod" +} \ No newline at end of file diff --git a/kubernetes/deployment.yaml b/kubernetes/deployment.yaml new file mode 100644 index 0000000..d4105b3 --- /dev/null +++ b/kubernetes/deployment.yaml @@ -0,0 +1,27 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: tessesdotnet + labels: + app: tessesdotnet +spec: + replicas: 3 + selector: + matchLabels: + app: tessesdotnet + template: + metadata: + labels: + app: tessesdotnet + spec: + containers: + - name: tessesdotnet + image: git.tesses.org/tesses50/tessesdotnet:latest + ports: + - containerPort: 4206 + resources: + requests: + cpu: 200m + memory: 500Mi + limits: + memory: 600Mi \ No newline at end of file diff --git a/kubernetes/service.yaml b/kubernetes/service.yaml new file mode 100644 index 0000000..b238c62 --- /dev/null +++ b/kubernetes/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: tessesdotnet +spec: + type: NodePort + selector: + app: tessesdotnet + ports: + - protocol: TCP + port: 30001 + targetPort: 4206 + nodePort: 30001 \ No newline at end of file diff --git a/res/css/styles-new.css b/res/css/styles-new.css new file mode 100644 index 0000000..5090147 --- /dev/null +++ b/res/css/styles-new.css @@ -0,0 +1,185 @@ +* { + font-family:'Courier New', Courier, monospace; + margin: 0; +} +@media screen { + + +.nav-bar h1 +{ + color: darkorange; +} +.nav-bar { + background-color: darkgreen; + padding-top: 20px; + padding-bottom: 20px; + display: flex; + justify-content: space-between; + align-content: center; +} +#branding { + padding-left: 40px; + display: flex; + +} +#branding img { + padding-right: 15px; +} +.nav-bar ul +{ + display: flex; + list-style-type: none; + flex-wrap: wrap; + align-content: center; + padding-right: 20px; +} +.nav-bar-print +{ + display: none; +} +.nav-link +{ + font-size: 1.25rem; + padding-left: 20px; +} +.nav-link a +{ + text-decoration: none; + color: blue; +} +.nav-link a:visited +{ + color: blue; + cursor: pointer; +} +.nav-link a:hover +{ + color: orangered; +} +.nav-link a:selected +{ + color: orange; +} + +main { + margin: 5%; +} +body { + background-color: #222; + color: white; +} +@media only screen and (max-width: 1280px) { +.jesus { + position: absolute; + right: 0; + bottom: 0; + max-width: 50vw; + max-height: 40vh; + z-index: -5; +} +} +@media only screen and (min-width: 1280px) { +.jesus +{ + position: absolute; + right: 0; + top: 0; + max-width: 100vw; + max-height: 100vh; + z-index: -1; +} +} +.website_table th,td +{ + border: 1px solid; +} +a { + color: lime; +} +a:visited { + color: lightseagreen; + +} +a:hover { + color: orange; +} + +} + +@media print { + .nav-bar h1 +{ + color: black; +} +.nav-bar { + + display: none; +} +.nav-bar ul +{ + display: flex; + list-style-type: none; + flex-wrap: wrap; + align-content: center; +} +.nav-link +{ + font-size: 1.25rem; + padding-left: 20px; +} +.nav-link a +{ + text-decoration: none; + color: black; +} +.nav-link a:visited +{ + text-decoration: none; + color: black; + cursor: pointer; +} +.nav-link a:hover +{ + text-decoration: none; + color: black; +} +.nav-link a:selected +{ + text-decoration: none; + color: black; + +} + +main { + margin: 5%; +} +body { + background-color: #FFF; + color: #000; +} +.website_table th,td +{ + border: 1px solid; +} +a { + text-decoration: none; + color: black; +} +a:visited { + text-decoration: none; + color: black; + +} +a:hover { + text-decoration: none; + color: black; +} +* { + background-color: #FFF; + color: #000; +} +.nav-bar-print +{ + display: block; +} +} diff --git a/res/favicon.ico b/res/favicon.ico new file mode 100644 index 0000000..3fd66ae Binary files /dev/null and b/res/favicon.ico differ diff --git a/res/img/favicon.svg b/res/img/favicon.svg new file mode 100644 index 0000000..e92a662 --- /dev/null +++ b/res/img/favicon.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/res/img/jesus.svg b/res/img/jesus.svg new file mode 100755 index 0000000..fdba0bc --- /dev/null +++ b/res/img/jesus.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I wan + + you to be saved + I accept you Jesus as my Lord and saviour​ + Thank God we have Jesus + + + \ No newline at end of file diff --git a/src/components/shell.tcross b/src/components/shell.tcross new file mode 100644 index 0000000..12e4d9a --- /dev/null +++ b/src/components/shell.tcross @@ -0,0 +1,33 @@ +func Components.Shell(title,body) +{ + return + + + + + + + Tesses - {title} + + + + +
+ +
+ + +; +} \ No newline at end of file diff --git a/src/pages/cross-image.tcross b/src/pages/cross-image.tcross new file mode 100644 index 0000000..916da13 --- /dev/null +++ b/src/pages/cross-image.tcross @@ -0,0 +1,15 @@ +func Pages.CrossImage() +{ + + const html = +

This is the cross image

+ +the-cross + +
+License: CC BY 4.0 + +
; + + return Components.Shell("Cross Image", html); +} \ No newline at end of file diff --git a/src/pages/index.tcross b/src/pages/index.tcross new file mode 100644 index 0000000..7eee7b6 --- /dev/null +++ b/src/pages/index.tcross @@ -0,0 +1,50 @@ +func Pages.Index() +{ + const html = +

Home

+
+

+

GOOGLE WILL STOP ALLOWING SIDELOADING IN ANDROID, WHERE YOU WILL NEED TO FOLLOW GOOGLE PLAY TOS, PAY THEM, PROVIDE YOUR ID AS A DEVELOPER IF YOU MAKE APPS (EVEN FOR APPS OFF PLAY STORE), PLEASE STOP THIS VIEW {"https://keepandroidopen.org/"} for more info

+ Hello my name is Mike Nolan, and this is my Namecheap self hosted website. +
+ And yes if you were wondering, I do this for fun. +
+ This website is brought to you by CrossLang my own dynamicly typed programming language + +
+
+
+ +

+ + +
; + return Components.Shell("Home",html); +} diff --git a/src/pages/myapps.tcross b/src/pages/myapps.tcross new file mode 100644 index 0000000..221c02c --- /dev/null +++ b/src/pages/myapps.tcross @@ -0,0 +1,48 @@ +const myApps = [ + { + name = "CrossLang", + url = "https://crosslang.tesseslanguage.com/", + description = "A programming language I am working on (This website's backend is writen in it now)" + }, + { + name = "TimelapseNow", + url = "https://timelapse.tesses.net/", + description = "Record in steps" + }, + { + name = "TYTD2025", + url = "https://crosslang.tesseslanguage.com/software/webapps/tytd2025/", + description = "My YouTube downloader writen in CrossLang" + }, + { + name = "TessesFramework", + url = "https://onedev.site.tesses.net/tesses-framework", + description = "A library to make C++ more bearable for me (also used for CrossLang's VM)", + } +]; + +func Pages.MyApps() +{ + const html = +

My software

+ + + + + + + + + + + + + + + + +
AppDescription
{item.name}{item.description}
+
; + + return Components.Shell("My Other Sites",html); +} diff --git a/src/pages/othersites.tcross b/src/pages/othersites.tcross new file mode 100644 index 0000000..9e42bcb --- /dev/null +++ b/src/pages/othersites.tcross @@ -0,0 +1,56 @@ +const otherSites = [ + { + domain = "tesseslanguage.com", + description = "My programming language(s)" + }, + { + domain = "peertube.site.tesses.net", + description = "My peertube instance" + }, + { + domain = "tessesstudios.com", + description = "My media studio website, as of Dec 27, 2023 it is a mailing list (the actual website for tessesstudios.com is not done, I need to finish coding it)" + }, + { + domain = "onedev.site.tesses.net", + description = "Where my code resides at the moment" + }, + { + domain = "gitea.site.tesses.net", + description = "My old code" + }, + { + domain = "billwolfenheimer.com", + description="A fictionary site of the bad guy for a potential movie that I will hopefully create" + }, + { + domain = "tesses4you.myfreesites.net", + description="My first site" + } +]; + +func Pages.OtherSites() +{ + const html = +

My Other Websites

+ + + + + + + + + + + + + + + + +
UrlDescription
{item.domain}{item.description}
+
; + + return Components.Shell("My Other Sites",html); +} diff --git a/src/program.tcross b/src/program.tcross new file mode 100644 index 0000000..10e5616 --- /dev/null +++ b/src/program.tcross @@ -0,0 +1,41 @@ + +var pages = { + .["/"] = SendText("text/html",(ctx)=>Pages.Index()), + .["/cross-image"] = SendText("text/html",(ctx)=>Pages.CrossImage()), + .["/apps"] = SendText("text/html",(ctx)=>Pages.MyApps()), + .["/othersites"] = SendText("text/html",(ctx)=>Pages.OtherSites()), + .["/css/styles-new.css"] = SendBytes("styles-new.css",embed("css/styles-new.css")), + .["/img/favicon.svg"] = SendBytes("favicon.svg",embed("img/favicon.svg")), + .["/img/jesus.svg"] = SendBytes("jesus.svg",embed("img/jesus.svg")), + .["/robots.txt"] = SendText("text/plain",(ctx)=>"User-Agent: *\r\nAllow: /\r\n"), + .["/favicon.ico"] = SendBytes("favicon.ico",embed("favicon.ico")) +}; +func SendBytes(filename,data) +{ + return (ctx)=>{ + ctx.WithMimeType(Net.Http.MimeType(filename)).SendBytes(data); + }; +} + +func SendText(mimeType,cb) +{ + return (ctx)=>{ + + const text = cb(ctx); + ctx.WithMimeType(mimeType).SendText(text); + return true; + }; +} + +func main(args) +{ + Net.Http.ListenSimpleWithLoop((ctx)=>{ + if(pages.[ctx.Path](ctx) ?? false) + return true; + else { + ctx.StatusCode = 404; + ctx.WithMimeType("text/html").SendText(Components.Shell($"File {ctx.Path} Not Found",

:( Page {ctx.Path} not found

)); + return true; + } + },4206); +} \ No newline at end of file