diff --git a/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/meta.json b/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/meta.json deleted file mode 100644 index 7254d71..0000000 --- a/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"creation_dt": "2025-02-18T14:08:30Z", "creation_host": "d9ae498e3528"} \ No newline at end of file diff --git a/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/private_key.json b/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/private_key.json deleted file mode 100644 index fa0f91d..0000000 --- a/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/private_key.json +++ /dev/null @@ -1 +0,0 @@ -{"n": "uQiCR4LsrI4pn5LDm-WaCTHk49WaklEl_VDuYyLwlexMHPhOYwRuOy-aOXiC1LWtbs9QEl8dxricHe_uKH0YXYqfa971sI9NSmmshCJbdlJ7C_5M2maCYlaA_Wt7g-98lvrGVVOCBPfThpT8_-wKdxG6kQamrbrhPCdOn7zHrDoHWWHltLG62flSb2Y-j8xQIvd8LDFa3hsZR9xh98VWoaCb5XpVowbWnUKLpNWYicPAmSUYo3Do5-nJN5Iis6P0knWDh_H2Hh88NEiRqj3zt2TwQ0PSE5zo98n3fIg8hRdvF3lZR82023T6wm-XARDJreol9WDp0cmlkbTOm7m1JQ", "e": "AQAB", "d": "RNgloPXVmV5LnlO89AQ5i7JEt4CCQm5u9BFooPofCakhqKW6hJzhZqQPfdKY2wu9u7zmze8V5RpK-9iJhAcHScaKCliqkUbAOy-WQJOH9D48CfpUHe6GFJCa7a9QBYbVlFc59AVeGvsaeLh2acIpIqQ2Bj-zRHCD3R3C4ywaHrnVYq9iCQeOEIJ9VMpydNntvpVMpeT341_EGimp4ZTEMME9XZ35ipFC9arVEGUD_pWjJWZMWUB2Zm52fBEvFk1_7cWLIOErzFQUltWI8I7RaZgKe7MshTA0nl3XIBok3m0lpRfu4Jo8JkIMA2LDFYZf0G0PmeTcLcNkfMQ5ubXJ", "p": "9V9VnnY4JDHAGpvSDLM69-soXUdkIB8XKHMlyACMrixd2F9JT4EqQMjrPQGpLzolJ53CcBVheVZat5EgUansrigSYPlvflmUm9M5t55JUzvQMSxS1Mmo2Jp1SeBD3rD0BblZpVwFUhGB34uXFax0VLhRbDTc_qxDlJ8cRFZR4w0", "q": "wQwjvuy8iaNYpx7AdxOI6xw6gmNF3JcfvyxA-UJ9eAWqbTHqOsm6LPAUrMF4y7V7TceMd4KA00aW1A8u2AO0Wp9pQbu8HpjeRThNAaAzGCnYEC8nqg0t6emRQswgs-lzU6zDcM7LcZDbD7wQ4NLVAn6IQ2v5m6o7SrsSQbnR9Hk", "dp": "xVzbV0wruCE0LbLr7z8yzTsfCnhj9tpLHEQSPZ8DiQ0yptlt9D8mp1l0rWtqlAwm2oiwXsszzg9BhKl833LYZvTgY5P-tBiFyhjKMgFlZUeVHBhUv8c8wozqjnOO485dWUVO8AzmUq62UgLLkalXINXo2CplH4ucCC065VSxJPk", "dq": "BGCQFu4rQDux8OgjmQ-aVSposTgrB1tt3tnUB1LYoXYPbTZqhza3v_kZnuksIgJVb2gM6VDONvwsw1Ysy70Zw8xFiLYHB_KTZ6JlLJpDTlL0kTlgftyZo-ol3wvd2fZ7JPSP4ejud_6-2NZ803w0VEAmOtEh8cOkYIdpXJAoEJE", "qi": "1U3jgUeGrL7QS-R3SjEZty64_YCBmJXaDHDBny1uUcAl7giGmVqFdtfMoYgHGUcq7fYyRFv3BfUL3Uch8MH3XklLBrU_nXjYGqTxi0dLrA3WlSkbvgBWHcF3oegEdDR31mPt7-VIyNtzg3CagOnAL0Hvk3h9HWg8YO326L8i3FU", "kty": "RSA"} \ No newline at end of file diff --git a/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/regr.json b/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/regr.json deleted file mode 100644 index ddb9775..0000000 --- a/certbot/conf/accounts/acme-v02.api.letsencrypt.org/directory/68f57fbb84e7058b7509edef0d5b09bf/regr.json +++ /dev/null @@ -1 +0,0 @@ -{"body": {}, "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/2236033565"} \ No newline at end of file diff --git a/compose.yaml b/compose.yaml index 98ec3b8..1b6d61a 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,7 +1,9 @@ services: minishell: + container_name: "minishell" restart: always + build: context: ./minishell dockerfile: Dockerfile @@ -22,7 +24,6 @@ services: networks: website_net: - ipv4_address: "88.88.5.2" nginx-site: container_name: "nginx-site" @@ -31,26 +32,14 @@ services: restart: always volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - - ./certbot/conf:/etc/letsencrypt:ro - - ./certbot/www:/var/www/certbot:ro + - ./nginx/certs:/certs networks: website_net: - ipv4_address: "88.88.5.1" ports: - - 80:80 - - 443:443 - - certbot: - image: certbot/certbot - container_name: "certbot-site" - - volumes: - - ./certbot/conf:/etc/letsencrypt:rw - - ./certbot/www/:/var/www/certbot/:rw - - command: certonly --webroot --webroot-path /var/www/certbot --force-renewal --email victorvobis@protonmail.com -d 127.0.0.1 --agree-tos + - 5080:80 + - 5443:443 website: container_name: "site" @@ -61,13 +50,9 @@ services: networks: website_net: - ipv4_address: "88.88.5.3" networks: website_net: - # external: false + external: true # internal: true driver: bridge - ipam: - config: - - subnet: "88.88.0.0/21" diff --git a/minishell/Dockerfile b/minishell/Dockerfile index 844fe09..573a1dc 100644 --- a/minishell/Dockerfile +++ b/minishell/Dockerfile @@ -6,7 +6,7 @@ ENV USERNAME="shelluser" \ TZ="Etc/UTC" COPY ./entrypoint.sh / -COPY --chmod=011 ./minishell_src/bin/minishell /bin/minishell +COPY --chmod=011 ./bin/minishell /bin/minishell RUN apk update && \ apk add --no-cache tini ttyd tzdata vim nano && \ diff --git a/minishell/bin/minishell b/minishell/bin/minishell new file mode 100755 index 0000000..0db7116 Binary files /dev/null and b/minishell/bin/minishell differ diff --git a/minishell/minishell_src/Makefile b/minishell/minishell_src/Makefile index 78b0859..b3d4688 100644 --- a/minishell/minishell_src/Makefile +++ b/minishell/minishell_src/Makefile @@ -6,7 +6,7 @@ # By: anarama +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/07/05 12:24:47 by victor #+# #+# # -# Updated: 2025/02/15 15:18:58 by victor ### ########.fr # +# Updated: 2025/05/15 17:07:59 by victor ### ########.fr # # # # **************************************************************************** # @@ -75,7 +75,8 @@ LIBS := libft/libft.a # Create object directory if none exists $(shell mkdir -p $(BINDIR) $(OBJDIR) $(OBJDIR)/ast $(OBJDIR)/src $(OBJDIR)/tokenizer $(OBJDIR)/builtin $(OBJDIR)/prompt) -all: $(NAME) +all: $(NAME) $(BINDIR) + cp -r $(BINDIR) .. $(NAME): $(OBJ) $(AST_OBJ) $(TOKEN_OBJ) $(BUILDIN_OBJ) $(PROMPT_OBJ) $(LIBS) minishell.h $(CC) -static $(CFLAGS) $(OBJ) $(AST_OBJ) $(TOKEN_OBJ) $(BUILDIN_OBJ) $(PROMPT_OBJ) $(LIBS) -o $(NAME) diff --git a/minishell/minishell_src/bin/minishell b/minishell/minishell_src/bin/minishell index 2f64a70..0db7116 100755 Binary files a/minishell/minishell_src/bin/minishell and b/minishell/minishell_src/bin/minishell differ diff --git a/minishell/minishell_src/libft/libft.a b/minishell/minishell_src/libft/libft.a index 1361ee4..8d474f9 100644 Binary files a/minishell/minishell_src/libft/libft.a and b/minishell/minishell_src/libft/libft.a differ diff --git a/misc/deploy.sh b/misc/deploy.sh index 28976e0..002982d 100755 --- a/misc/deploy.sh +++ b/misc/deploy.sh @@ -1,17 +1,13 @@ #!/bin/bash -cd .. - - # reset server_website directory rm -rf server_website -ssh server rm -rf website -mkdir -p server_website/{minishell,vvsite/{target,debug}} +ssh server rm -rf /home/victor/website +mkdir -p server_website/{minishell,vvsite} # Build server binary -cd vvsite && cargo leptos build -cp -r target/site ../server_website/vvsite/target -cp -r target/debug Dockerfile Cargo.toml ../server_website/vvsite/target/ +cd vvsite && cargo leptos build --release +cp -r target/release/vvsite Dockerfile Cargo.toml target/site ../server_website/vvsite # Build minishell files @@ -22,6 +18,5 @@ cp -r ./minishell_src/bin ./Dockerfile ./entrypoint.sh ../server_website/minishe # Copy to server cd .. cp -r ./nginx ./compose.yaml server_website - scp -r server_website server:/home/victor/website diff --git a/nginx/certs/localhost-key.pem b/nginx/certs/localhost-key.pem new file mode 100644 index 0000000..74ce249 --- /dev/null +++ b/nginx/certs/localhost-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCpakWP6NAAE14J +GxGHqZz6QyC4KjkiATfvGin/zfgnmDRM2rrAcft8xIWJrp8cVBW0U7UzljK2McXw +UKHLjPkzCwLU2xLHHaRvK1N3Clh/ndUxDcNr3ftsupvW8EcS/v/Jolg2CZJIuWCS +v7BwgagCkrYMnioNoaf+Yok3L3Jh7HLlsOXMHs9DuTA26vskhqIxU88vHwpRLH23 +UyIQHhURlCxWpZ/uzwBGyS+51GgqTMWYhf2zu83tBlEB1PpTv70vPQ+1GEo3nEEz +vMGYtlh/TDyogmOZooOevZZIIFgjzrpCm0jtiL5ud4zwbNnIqFCiXALak9fM7I4y +fQs7/rwxAgMBAAECggEAJ0+AeqcT9KCJ1mUQiUEjKrL+2Zz6ithriTCyBChf55ga +sqaiZNtN9qKHNe5t/x3Ht4Mg7apxc/NSsbOUB25buKtaade3oLpRGHaeNGYTKPGP +sYU3DkWA/LbESHiSlWbUJY5lF4zbA8L4FLUkFMcRHB+83Gqq6WTUXWOx4TtCOFRL +dwZNjzOCl0EUXzDubK65/kYH2shhreFhXGB/9r2kuB/WTY+shDgdH2/0vUeZMENe +f8JI/miv2iqN2m0vt1Rau7QpLlaH0PpN+qTNA2HWZJsI8q0hMrIi65VgmNxl12uy +QwPOloJTbW6qR/jTH/h2koV4YPHaz+li3Ax8o9V+fQKBgQDELoBrK54r5+5tL7sy +D2Z97/ZySMjbc2jBdKfG3NbE7nd2QM3ZqHhgqchTpg8eis7Tqe65fFQH/RHLxaRu +D5fBeEwqOhG/jETy7dqCiYKffh20VqA3j0D5VVDbxU5bathHFcpNdmeQK29ljfqv +tPkAJqbN78+nfid+oS8ltOHg5wKBgQDdEm966+cC5cFOpct53dbIcNZQyDucVe1c +2O9lHJesKFroMcnM+gSEP4mnFCbz3wPzU7w9JrG43AiE8wKSJkp1fkuRc7DNPZiK +IwYGbPAv4aCCMm+D74ZLyRu39wtypnPjVJPylpx+UDHbfAyZ4JUpV/fBLIR1O0Fi +6Dsl+yqfJwKBgQCcTxTAzxMKlpQQ6Pv0yfJ2m1A4BKgMueqYYRMgzmpMpFgIn1+k +cafgFMbpZyEay6w5V2c+4MGvT8LzIfl+O+xFGU1OQ9BKVz/EcyEr6tZpr7mJK5Ai +VICHaKOxR4bELeA+2yzCBXpEk2cBeltnzgCrTyCOaul/4XMkYNbI61MhtwKBgQDb +O80SOZ9+YBqzw/dlg3ncjQn8UpXLE+uwh/Hgc9p2AA8m9TkK7WZNQDViW7nFXwSr +6f5jJlxY1twb/GIwTYjJu9V1CSXsY4lCdDklZiNLWJW0iA/O51pnDalPZs8Tg76p +UtblXDcVjLHk18AnWXCS74njKCKzn2/YhjUiFVLPQQKBgEHl6glQtlGc7JoXUqDA +RdMxdMSwxgIagE9OWbOAsVH/r3GVoOIBwnEBc0gXYogw2liLk70+KsIUhfmBTtP4 +3qk37I8XPUx4p8psbfSWBb9mamybqUgnhmyYhy+W8HSYkO1yyVhI3ZS4uDUkih8I +CeNe8noeiEM8SCX8lU3j3fK0 +-----END PRIVATE KEY----- diff --git a/nginx/certs/localhost.pem b/nginx/certs/localhost.pem new file mode 100644 index 0000000..0b3f139 --- /dev/null +++ b/nginx/certs/localhost.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEDTCCAnWgAwIBAgIRAPRgbgFLTFKpFYfiY0pJYPIwDQYJKoZIhvcNAQELBQAw +XzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMRowGAYDVQQLDBF2aWN0 +b3JAYXJjaHZpY3RvcjEhMB8GA1UEAwwYbWtjZXJ0IHZpY3RvckBhcmNodmljdG9y +MB4XDTI1MDUxNTE0NTMyNloXDTI3MDgxNTE0NTMyNlowRTEnMCUGA1UEChMebWtj +ZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMRowGAYDVQQLDBF2aWN0b3JAYXJj +aHZpY3RvcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKlqRY/o0AAT +XgkbEYepnPpDILgqOSIBN+8aKf/N+CeYNEzausBx+3zEhYmunxxUFbRTtTOWMrYx +xfBQocuM+TMLAtTbEscdpG8rU3cKWH+d1TENw2vd+2y6m9bwRxL+/8miWDYJkki5 +YJK/sHCBqAKStgyeKg2hp/5iiTcvcmHscuWw5cwez0O5MDbq+ySGojFTzy8fClEs +fbdTIhAeFRGULFaln+7PAEbJL7nUaCpMxZiF/bO7ze0GUQHU+lO/vS89D7UYSjec +QTO8wZi2WH9MPKiCY5mig569lkggWCPOukKbSO2Ivm53jPBs2cioUKJcAtqT18zs +jjJ9Czv+vDECAwEAAaNeMFwwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsG +AQUFBwMBMB8GA1UdIwQYMBaAFBn57CFPsdm+TXiIpmmMkLxjKV1+MBQGA1UdEQQN +MAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAYEABzsAzA7nuntbswiVPF8W +QTEJJKt83DAMv4dIBHDChaTfEZKbV9irfjg66fpkt56B7AejykN/AZYwJp65NAz4 +0i9+/m2j1VXXF9EOiX5d4M/AXZ9vE5bfs2wk6GfRn4suCzIyAzs9Tf4vj1ck6QgP +l/cXpHoCbkv84vxYyRjLVrciBNCwolyTm4JZGEgEZkvohbdmuSgctd+hwlAH/NSS +WfG59sK8CRkEG75i3RCtKsQoOIXf+2MX2HSC5NVlMUZ2fl9ctAYmC+7p8N93g6FK +RxiUzOvYA1kDBjMWnVWRiid6BQxl/xWzTwPzim60wetYEZcyCf6R6NCFUcvuDLEz +OtKqvKuvKlnWn5ufAJODsh6cPf4NK+YNMoVraQYt04yDFutEumFBA22Lb35kF5UR +VahZnv/6uHT77WEZMVi3rPtXxKpY3BB5YoXL0hJlYhHvBVm3n8rLJVuWR8SAFl3k +XjcUUEi+EAJ+5Oz0X3+RNAl+cD2FcyHky/AarS7irKKc +-----END CERTIFICATE----- diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 99c85f3..12a8616 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -1,143 +1,56 @@ - #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; - #pid logs/nginx.pid; -# events { worker_connections 1024; } - http { limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; - server { - listen 80; - listen [::]:80; + server { - charset utf-8; + listen 80; + listen [::]:80; - server_name victorvobis www.victorvobis.mooo.com; - server_tokens off; + charset utf-8; - location /.well-known/acme-challenge/ { - limit_req zone=one burst=10 nodelay; - root /var/www/certbot; - } - return 301 https://$host$request_uri; + server_name victorvobis.mooo.com; + server_tokens off; - } + return 301 https://$host:5443$request_uri; - server { - listen 80; - listen [::]:80; + } - charset utf-8; + server { - server_name remoteserver www.remoteserver.vps.webdock.cloud; - server_tokens off; + listen 443 ssl; - location /.well-known/acme-challenge/ { - limit_req zone=one burst=10 nodelay; - root /var/www/certbot; - } - return 301 https://$host$request_uri; + ssl_certificate /certs/localhost.pem; + ssl_certificate_key /certs/localhost-key.pem; - } - server { - - listen 443 ssl; - - ssl_certificate /etc/letsencrypt/live/remoteserver.vps.webdock.cloud/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/remoteserver.vps.webdock.cloud/privkey.pem; - - location /minishell/vnc { - proxy_pass http://88.88.5.2:8006/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - location / { - proxy_pass http://88.88.5.3:3000/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - } - - #error_page 404 /404.html; - - # redirect server error pages to the static page /50x.html - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} - - #access_log logs/host.access.log main; - - # another virtual host using mix of IP-, name-, and port-based configuration - # - #server { - # listen 8000; - # listen somename:8080; - # server_name somename alias another.alias; - - # location / { - # root html; - # index index.html index.htm; - # } - #} - - - # HTTPS server - # - #server { - # listen 443 ssl; - # server_name localhost; - - # ssl_certificate cert.pem; - # ssl_certificate_key cert.key; - - # ssl_session_cache shared:SSL:1m; - # ssl_session_timeout 5m; - - # ssl_ciphers HIGH:!aNULL:!MD5; - # ssl_prefer_server_ciphers on; - - # location / { - # root html; - # index index.html index.htm; - # } - #} + location /minishell/vnc { + proxy_pass http://minishell:8006/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location / { + proxy_pass http://website:3000/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } } diff --git a/remote_config/Dockerfile b/remote_config/Dockerfile new file mode 100644 index 0000000..fb9ba24 --- /dev/null +++ b/remote_config/Dockerfile @@ -0,0 +1,9 @@ +FROM archlinux$ +WORKDIR /website$ + +COPY ./site /website/target/site$ +COPY ./vvsite /website/vvsite$ +COPY ./Cargo.toml /website/Cargo.toml$ + +RUN chmod +x /website/vvsite$ +CMD ["/website/vvsite"]$ diff --git a/remote_config/deploy.sh b/remote_config/deploy.sh new file mode 100755 index 0000000..e86d691 --- /dev/null +++ b/remote_config/deploy.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -xe + +# reset server_website directory +rm -rf server_website +ssh server rm -rf /home/victor/website +mkdir -p server_website/{minishell,vvsite} + +# Build server binary +cd vvsite && cargo leptos build --release +cp -r target/release/vvsite ../remote_config/Dockerfile Cargo.toml target/site ../server_website/vvsite + + +# Build minishell files +cd ../minishell +make -C minishell_src +cp -r ./minishell_src/bin ./Dockerfile ./entrypoint.sh ../server_website/minishell + +# Copy to server +cd .. +cp -r ./nginx ./compose.yaml server_website +cp ./remote_config/nginx.conf server_website/nginx/nginx.conf +scp -r server_website server:/home/victor/website + diff --git a/remote_config/nginx.conf b/remote_config/nginx.conf new file mode 100644 index 0000000..b747546 --- /dev/null +++ b/remote_config/nginx.conf @@ -0,0 +1,56 @@ +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; +#pid logs/nginx.pid; + +events { + worker_connections 1024; +} + +http { + limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; + server { + + listen 80; + listen [::]:80; + + charset utf-8; + + server_name victorvobis.mooo.com; + server_tokens off; + + return 301 https://$host$request_uri; + + } + + server { + + listen 443 ssl; + + ssl_certificate /certs/localhost.pem; + ssl_certificate_key /certs/localhost-key.pem; + + location /minishell/vnc { + proxy_pass http://minishell:8006/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location / { + proxy_pass http://website:3000/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } +} diff --git a/server_website/compose.yaml b/server_website/compose.yaml new file mode 100644 index 0000000..1b6d61a --- /dev/null +++ b/server_website/compose.yaml @@ -0,0 +1,58 @@ +services: + minishell: + + container_name: "minishell" + restart: always + + build: + context: ./minishell + dockerfile: Dockerfile + + cap_drop: + - ALL + cap_add: + - SETGID + - FSETID + - SETUID + + devices: + - /dev/kvm + + # Prevents gaining new privileges + security_opt: + - no-new-privileges + + networks: + website_net: + + nginx-site: + container_name: "nginx-site" + image: nginx + + restart: always + volumes: + - ./nginx/nginx.conf:/etc/nginx/nginx.conf + - ./nginx/certs:/certs + + networks: + website_net: + + ports: + - 5080:80 + - 5443:443 + + website: + container_name: "site" + restart: always + build: + context: ./vvsite + dockerfile: Dockerfile + + networks: + website_net: + +networks: + website_net: + external: true + # internal: true + driver: bridge diff --git a/server_website/minishell/Dockerfile b/server_website/minishell/Dockerfile new file mode 100644 index 0000000..573a1dc --- /dev/null +++ b/server_website/minishell/Dockerfile @@ -0,0 +1,19 @@ +FROM alpine +ENV USERNAME="shelluser" \ + PASSWORD="" \ + SUDO_OK="false" \ + AUTOLOGIN="true" \ + TZ="Etc/UTC" + +COPY ./entrypoint.sh / +COPY --chmod=011 ./bin/minishell /bin/minishell + +RUN apk update && \ + apk add --no-cache tini ttyd tzdata vim nano && \ + chmod 700 /entrypoint.sh && \ + touch /etc/.firstrun && \ + ln -s "/usr/share/zoneinfo/$TZ" /etc/localtime && \ + echo $TZ > /etc/timezone + +ENTRYPOINT ["/sbin/tini", "--"] +CMD ["/entrypoint.sh"] diff --git a/server_website/minishell/bin/minishell b/server_website/minishell/bin/minishell new file mode 100755 index 0000000..0db7116 Binary files /dev/null and b/server_website/minishell/bin/minishell differ diff --git a/server_website/minishell/entrypoint.sh b/server_website/minishell/entrypoint.sh new file mode 100644 index 0000000..20955f3 --- /dev/null +++ b/server_website/minishell/entrypoint.sh @@ -0,0 +1,54 @@ +#!/bin/sh +set -e +#set -x + +TTYD_ARGS="login" + +# Check if this is the container's first run +if [ -f /etc/.firstrun ]; then + # Create user account + echo >> /etc/shells /bin/minishell + adduser -D --shell=/bin/sh $USERNAME + echo "#!/bin/sh + trap '' SIGINT + while : + do + echo "*** Starting Minishell ***" + minishell + done" >> /home/$USERNAME/.runshell.sh + chmod +x /home/$USERNAME/.runshell.sh + echo >> /home/$USERNAME/.profile "./.runshell.sh" + + # Add a password to the user + echo "$USERNAME:$PASSWORD" | chpasswd + + # Allow access to sudo if permitted + if [ $SUDO_OK == "true" ]; then + addgroup $USERNAME wheel + sed -i '/%wheel ALL=(ALL) ALL/s/^# //g' /etc/sudoers + fi + + # Prevent this from running again + rm /etc/.firstrun +fi + +# Optionally set a timezone +CURRENT_TZ=$(cat /etc/timezone) +if [ "$TZ" != "$CURRENT_TZ" ]; then + echo "Setting timezone to $TZ" + + # delete symlink if it exists + [ -f /etc/localtime ] && rm /etc/localtime + + # set timezone + ln -s "/usr/share/zoneinfo/$TZ" /etc/localtime + echo $TZ > /etc/timezone +fi + +# Auto login the user, if allowed +[ $AUTOLOGIN == "true" ] && TTYD_ARGS="$TTYD_ARGS -f $USERNAME" + +passwd -l root + +# Start ttyd +exec ttyd -W -m 5 -p 8006 $TTYD_ARGS diff --git a/server_website/nginx/certs/localhost-key.pem b/server_website/nginx/certs/localhost-key.pem new file mode 100644 index 0000000..74ce249 --- /dev/null +++ b/server_website/nginx/certs/localhost-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCpakWP6NAAE14J +GxGHqZz6QyC4KjkiATfvGin/zfgnmDRM2rrAcft8xIWJrp8cVBW0U7UzljK2McXw +UKHLjPkzCwLU2xLHHaRvK1N3Clh/ndUxDcNr3ftsupvW8EcS/v/Jolg2CZJIuWCS +v7BwgagCkrYMnioNoaf+Yok3L3Jh7HLlsOXMHs9DuTA26vskhqIxU88vHwpRLH23 +UyIQHhURlCxWpZ/uzwBGyS+51GgqTMWYhf2zu83tBlEB1PpTv70vPQ+1GEo3nEEz +vMGYtlh/TDyogmOZooOevZZIIFgjzrpCm0jtiL5ud4zwbNnIqFCiXALak9fM7I4y +fQs7/rwxAgMBAAECggEAJ0+AeqcT9KCJ1mUQiUEjKrL+2Zz6ithriTCyBChf55ga +sqaiZNtN9qKHNe5t/x3Ht4Mg7apxc/NSsbOUB25buKtaade3oLpRGHaeNGYTKPGP +sYU3DkWA/LbESHiSlWbUJY5lF4zbA8L4FLUkFMcRHB+83Gqq6WTUXWOx4TtCOFRL +dwZNjzOCl0EUXzDubK65/kYH2shhreFhXGB/9r2kuB/WTY+shDgdH2/0vUeZMENe +f8JI/miv2iqN2m0vt1Rau7QpLlaH0PpN+qTNA2HWZJsI8q0hMrIi65VgmNxl12uy +QwPOloJTbW6qR/jTH/h2koV4YPHaz+li3Ax8o9V+fQKBgQDELoBrK54r5+5tL7sy +D2Z97/ZySMjbc2jBdKfG3NbE7nd2QM3ZqHhgqchTpg8eis7Tqe65fFQH/RHLxaRu +D5fBeEwqOhG/jETy7dqCiYKffh20VqA3j0D5VVDbxU5bathHFcpNdmeQK29ljfqv +tPkAJqbN78+nfid+oS8ltOHg5wKBgQDdEm966+cC5cFOpct53dbIcNZQyDucVe1c +2O9lHJesKFroMcnM+gSEP4mnFCbz3wPzU7w9JrG43AiE8wKSJkp1fkuRc7DNPZiK +IwYGbPAv4aCCMm+D74ZLyRu39wtypnPjVJPylpx+UDHbfAyZ4JUpV/fBLIR1O0Fi +6Dsl+yqfJwKBgQCcTxTAzxMKlpQQ6Pv0yfJ2m1A4BKgMueqYYRMgzmpMpFgIn1+k +cafgFMbpZyEay6w5V2c+4MGvT8LzIfl+O+xFGU1OQ9BKVz/EcyEr6tZpr7mJK5Ai +VICHaKOxR4bELeA+2yzCBXpEk2cBeltnzgCrTyCOaul/4XMkYNbI61MhtwKBgQDb +O80SOZ9+YBqzw/dlg3ncjQn8UpXLE+uwh/Hgc9p2AA8m9TkK7WZNQDViW7nFXwSr +6f5jJlxY1twb/GIwTYjJu9V1CSXsY4lCdDklZiNLWJW0iA/O51pnDalPZs8Tg76p +UtblXDcVjLHk18AnWXCS74njKCKzn2/YhjUiFVLPQQKBgEHl6glQtlGc7JoXUqDA +RdMxdMSwxgIagE9OWbOAsVH/r3GVoOIBwnEBc0gXYogw2liLk70+KsIUhfmBTtP4 +3qk37I8XPUx4p8psbfSWBb9mamybqUgnhmyYhy+W8HSYkO1yyVhI3ZS4uDUkih8I +CeNe8noeiEM8SCX8lU3j3fK0 +-----END PRIVATE KEY----- diff --git a/server_website/nginx/certs/localhost.pem b/server_website/nginx/certs/localhost.pem new file mode 100644 index 0000000..0b3f139 --- /dev/null +++ b/server_website/nginx/certs/localhost.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEDTCCAnWgAwIBAgIRAPRgbgFLTFKpFYfiY0pJYPIwDQYJKoZIhvcNAQELBQAw +XzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMRowGAYDVQQLDBF2aWN0 +b3JAYXJjaHZpY3RvcjEhMB8GA1UEAwwYbWtjZXJ0IHZpY3RvckBhcmNodmljdG9y +MB4XDTI1MDUxNTE0NTMyNloXDTI3MDgxNTE0NTMyNlowRTEnMCUGA1UEChMebWtj +ZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMRowGAYDVQQLDBF2aWN0b3JAYXJj +aHZpY3RvcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKlqRY/o0AAT +XgkbEYepnPpDILgqOSIBN+8aKf/N+CeYNEzausBx+3zEhYmunxxUFbRTtTOWMrYx +xfBQocuM+TMLAtTbEscdpG8rU3cKWH+d1TENw2vd+2y6m9bwRxL+/8miWDYJkki5 +YJK/sHCBqAKStgyeKg2hp/5iiTcvcmHscuWw5cwez0O5MDbq+ySGojFTzy8fClEs +fbdTIhAeFRGULFaln+7PAEbJL7nUaCpMxZiF/bO7ze0GUQHU+lO/vS89D7UYSjec +QTO8wZi2WH9MPKiCY5mig569lkggWCPOukKbSO2Ivm53jPBs2cioUKJcAtqT18zs +jjJ9Czv+vDECAwEAAaNeMFwwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsG +AQUFBwMBMB8GA1UdIwQYMBaAFBn57CFPsdm+TXiIpmmMkLxjKV1+MBQGA1UdEQQN +MAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAYEABzsAzA7nuntbswiVPF8W +QTEJJKt83DAMv4dIBHDChaTfEZKbV9irfjg66fpkt56B7AejykN/AZYwJp65NAz4 +0i9+/m2j1VXXF9EOiX5d4M/AXZ9vE5bfs2wk6GfRn4suCzIyAzs9Tf4vj1ck6QgP +l/cXpHoCbkv84vxYyRjLVrciBNCwolyTm4JZGEgEZkvohbdmuSgctd+hwlAH/NSS +WfG59sK8CRkEG75i3RCtKsQoOIXf+2MX2HSC5NVlMUZ2fl9ctAYmC+7p8N93g6FK +RxiUzOvYA1kDBjMWnVWRiid6BQxl/xWzTwPzim60wetYEZcyCf6R6NCFUcvuDLEz +OtKqvKuvKlnWn5ufAJODsh6cPf4NK+YNMoVraQYt04yDFutEumFBA22Lb35kF5UR +VahZnv/6uHT77WEZMVi3rPtXxKpY3BB5YoXL0hJlYhHvBVm3n8rLJVuWR8SAFl3k +XjcUUEi+EAJ+5Oz0X3+RNAl+cD2FcyHky/AarS7irKKc +-----END CERTIFICATE----- diff --git a/server_website/nginx/html/css/output.css b/server_website/nginx/html/css/output.css new file mode 100644 index 0000000..891da29 --- /dev/null +++ b/server_website/nginx/html/css/output.css @@ -0,0 +1,758 @@ +/*! tailwindcss v4.0.6 | MIT License | https://tailwindcss.com */ +@layer theme, base, components, utilities; +@layer theme { + :root, :host { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + --color-red-50: oklch(0.971 0.013 17.38); + --color-red-100: oklch(0.936 0.032 17.717); + --color-red-200: oklch(0.885 0.062 18.334); + --color-red-300: oklch(0.808 0.114 19.571); + --color-red-400: oklch(0.704 0.191 22.216); + --color-red-500: oklch(0.637 0.237 25.331); + --color-red-600: oklch(0.577 0.245 27.325); + --color-red-700: oklch(0.505 0.213 27.518); + --color-red-800: oklch(0.444 0.177 26.899); + --color-red-900: oklch(0.396 0.141 25.723); + --color-red-950: oklch(0.258 0.092 26.042); + --color-orange-50: oklch(0.98 0.016 73.684); + --color-orange-100: oklch(0.954 0.038 75.164); + --color-orange-200: oklch(0.901 0.076 70.697); + --color-orange-300: oklch(0.837 0.128 66.29); + --color-orange-400: oklch(0.75 0.183 55.934); + --color-orange-500: oklch(0.705 0.213 47.604); + --color-orange-600: oklch(0.646 0.222 41.116); + --color-orange-700: oklch(0.553 0.195 38.402); + --color-orange-800: oklch(0.47 0.157 37.304); + --color-orange-900: oklch(0.408 0.123 38.172); + --color-orange-950: oklch(0.266 0.079 36.259); + --color-amber-50: oklch(0.987 0.022 95.277); + --color-amber-100: oklch(0.962 0.059 95.617); + --color-amber-200: oklch(0.924 0.12 95.746); + --color-amber-300: oklch(0.879 0.169 91.605); + --color-amber-400: oklch(0.828 0.189 84.429); + --color-amber-500: oklch(0.769 0.188 70.08); + --color-amber-600: oklch(0.666 0.179 58.318); + --color-amber-700: oklch(0.555 0.163 48.998); + --color-amber-800: oklch(0.473 0.137 46.201); + --color-amber-900: oklch(0.414 0.112 45.904); + --color-amber-950: oklch(0.279 0.077 45.635); + --color-yellow-50: oklch(0.987 0.026 102.212); + --color-yellow-100: oklch(0.973 0.071 103.193); + --color-yellow-200: oklch(0.945 0.129 101.54); + --color-yellow-300: oklch(0.905 0.182 98.111); + --color-yellow-400: oklch(0.852 0.199 91.936); + --color-yellow-500: oklch(0.795 0.184 86.047); + --color-yellow-600: oklch(0.681 0.162 75.834); + --color-yellow-700: oklch(0.554 0.135 66.442); + --color-yellow-800: oklch(0.476 0.114 61.907); + --color-yellow-900: oklch(0.421 0.095 57.708); + --color-yellow-950: oklch(0.286 0.066 53.813); + --color-lime-50: oklch(0.986 0.031 120.757); + --color-lime-100: oklch(0.967 0.067 122.328); + --color-lime-200: oklch(0.938 0.127 124.321); + --color-lime-300: oklch(0.897 0.196 126.665); + --color-lime-400: oklch(0.841 0.238 128.85); + --color-lime-500: oklch(0.768 0.233 130.85); + --color-lime-600: oklch(0.648 0.2 131.684); + --color-lime-700: oklch(0.532 0.157 131.589); + --color-lime-800: oklch(0.453 0.124 130.933); + --color-lime-900: oklch(0.405 0.101 131.063); + --color-lime-950: oklch(0.274 0.072 132.109); + --color-green-50: oklch(0.982 0.018 155.826); + --color-green-100: oklch(0.962 0.044 156.743); + --color-green-200: oklch(0.925 0.084 155.995); + --color-green-300: oklch(0.871 0.15 154.449); + --color-green-400: oklch(0.792 0.209 151.711); + --color-green-500: oklch(0.723 0.219 149.579); + --color-green-600: oklch(0.627 0.194 149.214); + --color-green-700: oklch(0.527 0.154 150.069); + --color-green-800: oklch(0.448 0.119 151.328); + --color-green-900: oklch(0.393 0.095 152.535); + --color-green-950: oklch(0.266 0.065 152.934); + --color-emerald-50: oklch(0.979 0.021 166.113); + --color-emerald-100: oklch(0.95 0.052 163.051); + --color-emerald-200: oklch(0.905 0.093 164.15); + --color-emerald-300: oklch(0.845 0.143 164.978); + --color-emerald-400: oklch(0.765 0.177 163.223); + --color-emerald-500: oklch(0.696 0.17 162.48); + --color-emerald-600: oklch(0.596 0.145 163.225); + --color-emerald-700: oklch(0.508 0.118 165.612); + --color-emerald-800: oklch(0.432 0.095 166.913); + --color-emerald-900: oklch(0.378 0.077 168.94); + --color-emerald-950: oklch(0.262 0.051 172.552); + --color-teal-50: oklch(0.984 0.014 180.72); + --color-teal-100: oklch(0.953 0.051 180.801); + --color-teal-200: oklch(0.91 0.096 180.426); + --color-teal-300: oklch(0.855 0.138 181.071); + --color-teal-400: oklch(0.777 0.152 181.912); + --color-teal-500: oklch(0.704 0.14 182.503); + --color-teal-600: oklch(0.6 0.118 184.704); + --color-teal-700: oklch(0.511 0.096 186.391); + --color-teal-800: oklch(0.437 0.078 188.216); + --color-teal-900: oklch(0.386 0.063 188.416); + --color-teal-950: oklch(0.277 0.046 192.524); + --color-cyan-50: oklch(0.984 0.019 200.873); + --color-cyan-100: oklch(0.956 0.045 203.388); + --color-cyan-200: oklch(0.917 0.08 205.041); + --color-cyan-300: oklch(0.865 0.127 207.078); + --color-cyan-400: oklch(0.789 0.154 211.53); + --color-cyan-500: oklch(0.715 0.143 215.221); + --color-cyan-600: oklch(0.609 0.126 221.723); + --color-cyan-700: oklch(0.52 0.105 223.128); + --color-cyan-800: oklch(0.45 0.085 224.283); + --color-cyan-900: oklch(0.398 0.07 227.392); + --color-cyan-950: oklch(0.302 0.056 229.695); + --color-sky-50: oklch(0.977 0.013 236.62); + --color-sky-100: oklch(0.951 0.026 236.824); + --color-sky-200: oklch(0.901 0.058 230.902); + --color-sky-300: oklch(0.828 0.111 230.318); + --color-sky-400: oklch(0.746 0.16 232.661); + --color-sky-500: oklch(0.685 0.169 237.323); + --color-sky-600: oklch(0.588 0.158 241.966); + --color-sky-700: oklch(0.5 0.134 242.749); + --color-sky-800: oklch(0.443 0.11 240.79); + --color-sky-900: oklch(0.391 0.09 240.876); + --color-sky-950: oklch(0.293 0.066 243.157); + --color-blue-50: oklch(0.97 0.014 254.604); + --color-blue-100: oklch(0.932 0.032 255.585); + --color-blue-200: oklch(0.882 0.059 254.128); + --color-blue-300: oklch(0.809 0.105 251.813); + --color-blue-400: oklch(0.707 0.165 254.624); + --color-blue-500: oklch(0.623 0.214 259.815); + --color-blue-600: oklch(0.546 0.245 262.881); + --color-blue-700: oklch(0.488 0.243 264.376); + --color-blue-800: oklch(0.424 0.199 265.638); + --color-blue-900: oklch(0.379 0.146 265.522); + --color-blue-950: oklch(0.282 0.091 267.935); + --color-indigo-50: oklch(0.962 0.018 272.314); + --color-indigo-100: oklch(0.93 0.034 272.788); + --color-indigo-200: oklch(0.87 0.065 274.039); + --color-indigo-300: oklch(0.785 0.115 274.713); + --color-indigo-400: oklch(0.673 0.182 276.935); + --color-indigo-500: oklch(0.585 0.233 277.117); + --color-indigo-600: oklch(0.511 0.262 276.966); + --color-indigo-700: oklch(0.457 0.24 277.023); + --color-indigo-800: oklch(0.398 0.195 277.366); + --color-indigo-900: oklch(0.359 0.144 278.697); + --color-indigo-950: oklch(0.257 0.09 281.288); + --color-violet-50: oklch(0.969 0.016 293.756); + --color-violet-100: oklch(0.943 0.029 294.588); + --color-violet-200: oklch(0.894 0.057 293.283); + --color-violet-300: oklch(0.811 0.111 293.571); + --color-violet-400: oklch(0.702 0.183 293.541); + --color-violet-500: oklch(0.606 0.25 292.717); + --color-violet-600: oklch(0.541 0.281 293.009); + --color-violet-700: oklch(0.491 0.27 292.581); + --color-violet-800: oklch(0.432 0.232 292.759); + --color-violet-900: oklch(0.38 0.189 293.745); + --color-violet-950: oklch(0.283 0.141 291.089); + --color-purple-50: oklch(0.977 0.014 308.299); + --color-purple-100: oklch(0.946 0.033 307.174); + --color-purple-200: oklch(0.902 0.063 306.703); + --color-purple-300: oklch(0.827 0.119 306.383); + --color-purple-400: oklch(0.714 0.203 305.504); + --color-purple-500: oklch(0.627 0.265 303.9); + --color-purple-600: oklch(0.558 0.288 302.321); + --color-purple-700: oklch(0.496 0.265 301.924); + --color-purple-800: oklch(0.438 0.218 303.724); + --color-purple-900: oklch(0.381 0.176 304.987); + --color-purple-950: oklch(0.291 0.149 302.717); + --color-fuchsia-50: oklch(0.977 0.017 320.058); + --color-fuchsia-100: oklch(0.952 0.037 318.852); + --color-fuchsia-200: oklch(0.903 0.076 319.62); + --color-fuchsia-300: oklch(0.833 0.145 321.434); + --color-fuchsia-400: oklch(0.74 0.238 322.16); + --color-fuchsia-500: oklch(0.667 0.295 322.15); + --color-fuchsia-600: oklch(0.591 0.293 322.896); + --color-fuchsia-700: oklch(0.518 0.253 323.949); + --color-fuchsia-800: oklch(0.452 0.211 324.591); + --color-fuchsia-900: oklch(0.401 0.17 325.612); + --color-fuchsia-950: oklch(0.293 0.136 325.661); + --color-pink-50: oklch(0.971 0.014 343.198); + --color-pink-100: oklch(0.948 0.028 342.258); + --color-pink-200: oklch(0.899 0.061 343.231); + --color-pink-300: oklch(0.823 0.12 346.018); + --color-pink-400: oklch(0.718 0.202 349.761); + --color-pink-500: oklch(0.656 0.241 354.308); + --color-pink-600: oklch(0.592 0.249 0.584); + --color-pink-700: oklch(0.525 0.223 3.958); + --color-pink-800: oklch(0.459 0.187 3.815); + --color-pink-900: oklch(0.408 0.153 2.432); + --color-pink-950: oklch(0.284 0.109 3.907); + --color-rose-50: oklch(0.969 0.015 12.422); + --color-rose-100: oklch(0.941 0.03 12.58); + --color-rose-200: oklch(0.892 0.058 10.001); + --color-rose-300: oklch(0.81 0.117 11.638); + --color-rose-400: oklch(0.712 0.194 13.428); + --color-rose-500: oklch(0.645 0.246 16.439); + --color-rose-600: oklch(0.586 0.253 17.585); + --color-rose-700: oklch(0.514 0.222 16.935); + --color-rose-800: oklch(0.455 0.188 13.697); + --color-rose-900: oklch(0.41 0.159 10.272); + --color-rose-950: oklch(0.271 0.105 12.094); + --color-slate-50: oklch(0.984 0.003 247.858); + --color-slate-100: oklch(0.968 0.007 247.896); + --color-slate-200: oklch(0.929 0.013 255.508); + --color-slate-300: oklch(0.869 0.022 252.894); + --color-slate-400: oklch(0.704 0.04 256.788); + --color-slate-500: oklch(0.554 0.046 257.417); + --color-slate-600: oklch(0.446 0.043 257.281); + --color-slate-700: oklch(0.372 0.044 257.287); + --color-slate-800: oklch(0.279 0.041 260.031); + --color-slate-900: oklch(0.208 0.042 265.755); + --color-slate-950: oklch(0.129 0.042 264.695); + --color-gray-50: oklch(0.985 0.002 247.839); + --color-gray-100: oklch(0.967 0.003 264.542); + --color-gray-200: oklch(0.928 0.006 264.531); + --color-gray-300: oklch(0.872 0.01 258.338); + --color-gray-400: oklch(0.707 0.022 261.325); + --color-gray-500: oklch(0.551 0.027 264.364); + --color-gray-600: oklch(0.446 0.03 256.802); + --color-gray-700: oklch(0.373 0.034 259.733); + --color-gray-800: oklch(0.278 0.033 256.848); + --color-gray-900: oklch(0.21 0.034 264.665); + --color-gray-950: oklch(0.13 0.028 261.692); + --color-zinc-50: oklch(0.985 0 0); + --color-zinc-100: oklch(0.967 0.001 286.375); + --color-zinc-200: oklch(0.92 0.004 286.32); + --color-zinc-300: oklch(0.871 0.006 286.286); + --color-zinc-400: oklch(0.705 0.015 286.067); + --color-zinc-500: oklch(0.552 0.016 285.938); + --color-zinc-600: oklch(0.442 0.017 285.786); + --color-zinc-700: oklch(0.37 0.013 285.805); + --color-zinc-800: oklch(0.274 0.006 286.033); + --color-zinc-900: oklch(0.21 0.006 285.885); + --color-zinc-950: oklch(0.141 0.005 285.823); + --color-neutral-50: oklch(0.985 0 0); + --color-neutral-100: oklch(0.97 0 0); + --color-neutral-200: oklch(0.922 0 0); + --color-neutral-300: oklch(0.87 0 0); + --color-neutral-400: oklch(0.708 0 0); + --color-neutral-500: oklch(0.556 0 0); + --color-neutral-600: oklch(0.439 0 0); + --color-neutral-700: oklch(0.371 0 0); + --color-neutral-800: oklch(0.269 0 0); + --color-neutral-900: oklch(0.205 0 0); + --color-neutral-950: oklch(0.145 0 0); + --color-stone-50: oklch(0.985 0.001 106.423); + --color-stone-100: oklch(0.97 0.001 106.424); + --color-stone-200: oklch(0.923 0.003 48.717); + --color-stone-300: oklch(0.869 0.005 56.366); + --color-stone-400: oklch(0.709 0.01 56.259); + --color-stone-500: oklch(0.553 0.013 58.071); + --color-stone-600: oklch(0.444 0.011 73.639); + --color-stone-700: oklch(0.374 0.01 67.558); + --color-stone-800: oklch(0.268 0.007 34.298); + --color-stone-900: oklch(0.216 0.006 56.043); + --color-stone-950: oklch(0.147 0.004 49.25); + --color-black: #000; + --color-white: #fff; + --spacing: 0.25rem; + --breakpoint-sm: 40rem; + --breakpoint-md: 48rem; + --breakpoint-lg: 64rem; + --breakpoint-xl: 80rem; + --breakpoint-2xl: 96rem; + --container-3xs: 16rem; + --container-2xs: 18rem; + --container-xs: 20rem; + --container-sm: 24rem; + --container-md: 28rem; + --container-lg: 32rem; + --container-xl: 36rem; + --container-2xl: 42rem; + --container-3xl: 48rem; + --container-4xl: 56rem; + --container-5xl: 64rem; + --container-6xl: 72rem; + --container-7xl: 80rem; + --text-xs: 0.75rem; + --text-xs--line-height: calc(1 / 0.75); + --text-sm: 0.875rem; + --text-sm--line-height: calc(1.25 / 0.875); + --text-base: 1rem; + --text-base--line-height: calc(1.5 / 1); + --text-lg: 1.125rem; + --text-lg--line-height: calc(1.75 / 1.125); + --text-xl: 1.25rem; + --text-xl--line-height: calc(1.75 / 1.25); + --text-2xl: 1.5rem; + --text-2xl--line-height: calc(2 / 1.5); + --text-3xl: 1.875rem; + --text-3xl--line-height: calc(2.25 / 1.875); + --text-4xl: 2.25rem; + --text-4xl--line-height: calc(2.5 / 2.25); + --text-5xl: 3rem; + --text-5xl--line-height: 1; + --text-6xl: 3.75rem; + --text-6xl--line-height: 1; + --text-7xl: 4.5rem; + --text-7xl--line-height: 1; + --text-8xl: 6rem; + --text-8xl--line-height: 1; + --text-9xl: 8rem; + --text-9xl--line-height: 1; + --font-weight-thin: 100; + --font-weight-extralight: 200; + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extrabold: 800; + --font-weight-black: 900; + --tracking-tighter: -0.05em; + --tracking-tight: -0.025em; + --tracking-normal: 0em; + --tracking-wide: 0.025em; + --tracking-wider: 0.05em; + --tracking-widest: 0.1em; + --leading-tight: 1.25; + --leading-snug: 1.375; + --leading-normal: 1.5; + --leading-relaxed: 1.625; + --leading-loose: 2; + --radius-xs: 0.125rem; + --radius-sm: 0.25rem; + --radius-md: 0.375rem; + --radius-lg: 0.5rem; + --radius-xl: 0.75rem; + --radius-2xl: 1rem; + --radius-3xl: 1.5rem; + --radius-4xl: 2rem; + --shadow-2xs: 0 1px rgb(0 0 0 / 0.05); + --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05); + --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05); + --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05); + --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05); + --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15); + --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12); + --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15); + --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1); + --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15); + --ease-in: cubic-bezier(0.4, 0, 1, 1); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); + --animate-spin: spin 1s linear infinite; + --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; + --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + --animate-bounce: bounce 1s infinite; + --blur-xs: 4px; + --blur-sm: 8px; + --blur-md: 12px; + --blur-lg: 16px; + --blur-xl: 24px; + --blur-2xl: 40px; + --blur-3xl: 64px; + --perspective-dramatic: 100px; + --perspective-near: 300px; + --perspective-normal: 500px; + --perspective-midrange: 800px; + --perspective-distant: 1200px; + --aspect-video: 16 / 9; + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + --default-font-family: var(--font-sans); + --default-font-feature-settings: var(--font-sans--font-feature-settings); + --default-font-variation-settings: var( + --font-sans--font-variation-settings + ); + --default-mono-font-family: var(--font-mono); + --default-mono-font-feature-settings: var( + --font-mono--font-feature-settings + ); + --default-mono-font-variation-settings: var( + --font-mono--font-variation-settings + ); + } +} +@layer base { + *, ::after, ::before, ::backdrop, ::file-selector-button { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0 solid; + } + html, :host { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + tab-size: 4; + font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" ); + font-feature-settings: var(--default-font-feature-settings, normal); + font-variation-settings: var( --default-font-variation-settings, normal ); + -webkit-tap-highlight-color: transparent; + } + body { + line-height: inherit; + } + hr { + height: 0; + color: inherit; + border-top-width: 1px; + } + abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: inherit; + } + a { + color: inherit; + -webkit-text-decoration: inherit; + text-decoration: inherit; + } + b, strong { + font-weight: bolder; + } + code, kbd, samp, pre { + font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace ); + font-feature-settings: var( --default-mono-font-feature-settings, normal ); + font-variation-settings: var( --default-mono-font-variation-settings, normal ); + font-size: 1em; + } + small { + font-size: 80%; + } + sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + } + :-moz-focusring { + outline: auto; + } + progress { + vertical-align: baseline; + } + summary { + display: list-item; + } + ol, ul, menu { + list-style: none; + } + img, svg, video, canvas, audio, iframe, embed, object { + display: block; + vertical-align: middle; + } + img, video { + max-width: 100%; + height: auto; + } + button, input, select, optgroup, textarea, ::file-selector-button { + font: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + letter-spacing: inherit; + color: inherit; + border-radius: 0; + background-color: transparent; + opacity: 1; + } + :where(select:is([multiple], [size])) optgroup { + font-weight: bolder; + } + :where(select:is([multiple], [size])) optgroup option { + padding-inline-start: 20px; + } + ::file-selector-button { + margin-inline-end: 4px; + } + ::placeholder { + opacity: 1; + color: color-mix(in oklab, currentColor 50%, transparent); + } + textarea { + resize: vertical; + } + ::-webkit-search-decoration { + -webkit-appearance: none; + } + ::-webkit-date-and-time-value { + min-height: 1lh; + text-align: inherit; + } + ::-webkit-datetime-edit { + display: inline-flex; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { + padding-block: 0; + } + :-moz-ui-invalid { + box-shadow: none; + } + button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { + appearance: button; + } + ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { + height: auto; + } + [hidden]:where(:not([hidden="until-found"])) { + display: none !important; + } +} +@layer utilities { + .m-2 { + margin: calc(var(--spacing) * 2); + } + .mt-1 { + margin-top: calc(var(--spacing) * 1); + } + .mr-2 { + margin-right: calc(var(--spacing) * 2); + } + .mb-4 { + margin-bottom: calc(var(--spacing) * 4); + } + .mb-6 { + margin-bottom: calc(var(--spacing) * 6); + } + .block { + display: block; + } + .flex { + display: flex; + } + .grid { + display: grid; + } + .h-screen { + height: 100vh; + } + .w-full { + width: 100%; + } + .w-screen { + width: 100vw; + } + .max-w-md { + max-width: var(--container-md); + } + .grow { + flex-grow: 1; + } + .grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); + } + .place-items-center { + place-items: center; + } + .items-center { + align-items: center; + } + .justify-center { + justify-content: center; + } + .self-center { + align-self: center; + } + .justify-self-start { + justify-self: flex-start; + } + .rounded { + border-radius: 0.25rem; + } + .border { + border-style: var(--tw-border-style); + border-width: 1px; + } + .bg-blue-500 { + background-color: var(--color-blue-500); + } + .bg-gray-100 { + background-color: var(--color-gray-100); + } + .bg-neutral-100 { + background-color: var(--color-neutral-100); + } + .bg-neutral-200 { + background-color: var(--color-neutral-200); + } + .bg-neutral-500 { + background-color: var(--color-neutral-500); + } + .bg-neutral-900 { + background-color: var(--color-neutral-900); + } + .bg-white { + background-color: var(--color-white); + } + .p-8 { + padding: calc(var(--spacing) * 8); + } + .p-20 { + padding: calc(var(--spacing) * 20); + } + .px-3 { + padding-inline: calc(var(--spacing) * 3); + } + .py-2 { + padding-block: calc(var(--spacing) * 2); + } + .text-center { + text-align: center; + } + .text-2xl { + font-size: var(--text-2xl); + line-height: var(--tw-leading, var(--text-2xl--line-height)); + } + .font-bold { + --tw-font-weight: var(--font-weight-bold); + font-weight: var(--font-weight-bold); + } + .text-gray-700 { + color: var(--color-gray-700); + } + .text-white { + color: var(--color-white); + } + .shadow-md { + --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .hover\:bg-blue-600 { + &:hover { + @media (hover: hover) { + background-color: var(--color-blue-600); + } + } + } + .focus\:border-blue-300 { + &:focus { + border-color: var(--color-blue-300); + } + } + .focus\:ring { + &:focus { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentColor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + .focus\:outline-none { + &:focus { + --tw-outline-style: none; + outline-style: none; + } + } +} +@keyframes spin { + to { + transform: rotate(360deg); + } +} +@keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +} +@keyframes pulse { + 50% { + opacity: 0.5; + } +} +@keyframes bounce { + 0%, 100% { + transform: translateY(-25%); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + 50% { + transform: none; + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +} +@property --tw-border-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-font-weight { + syntax: "*"; + inherits: false; +} +@property --tw-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-ring-inset { + syntax: "*"; + inherits: false; +} +@property --tw-ring-offset-width { + syntax: ""; + inherits: false; + initial-value: 0px; +} +@property --tw-ring-offset-color { + syntax: "*"; + inherits: false; + initial-value: #fff; +} +@property --tw-ring-offset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} diff --git a/server_website/nginx/html/css/style.css b/server_website/nginx/html/css/style.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/server_website/nginx/html/css/style.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/server_website/nginx/html/index.html b/server_website/nginx/html/index.html new file mode 100644 index 0000000..ca08fea --- /dev/null +++ b/server_website/nginx/html/index.html @@ -0,0 +1,47 @@ + + + + + + Login + + + + +
+

Login

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + + diff --git a/server_website/nginx/nginx.conf b/server_website/nginx/nginx.conf new file mode 100644 index 0000000..b747546 --- /dev/null +++ b/server_website/nginx/nginx.conf @@ -0,0 +1,56 @@ +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; +#pid logs/nginx.pid; + +events { + worker_connections 1024; +} + +http { + limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; + server { + + listen 80; + listen [::]:80; + + charset utf-8; + + server_name victorvobis.mooo.com; + server_tokens off; + + return 301 https://$host$request_uri; + + } + + server { + + listen 443 ssl; + + ssl_certificate /certs/localhost.pem; + ssl_certificate_key /certs/localhost-key.pem; + + location /minishell/vnc { + proxy_pass http://minishell:8006/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location / { + proxy_pass http://website:3000/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } +} diff --git a/server_website/vvsite/Cargo.toml b/server_website/vvsite/Cargo.toml new file mode 100644 index 0000000..be4bb1a --- /dev/null +++ b/server_website/vvsite/Cargo.toml @@ -0,0 +1,93 @@ +[package] +name = "vvsite" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +actix-files = { version = "0.6", optional = true } +actix-web = { version = "4", optional = true, features = ["macros"] } +console_error_panic_hook = "0.1" +http = { version = "1.0.0", optional = true } +leptos = { version = "0.6", features = ["nightly"] } +leptos_meta = { version = "0.6", features = ["nightly"] } +leptos_actix = { version = "0.6", optional = true } +leptos_router = { version = "0.6", features = ["nightly"] } +wasm-bindgen = "=0.2.100" + +[features] +csr = ["leptos/csr", "leptos_meta/csr", "leptos_router/csr"] +hydrate = ["leptos/hydrate", "leptos_meta/hydrate", "leptos_router/hydrate"] +ssr = [ + "dep:actix-files", + "dep:actix-web", + "dep:leptos_actix", + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", +] + +# Defines a size-optimized profile for the WASM bundle in release mode +[profile.wasm-release] +inherits = "release" +opt-level = 'z' +lto = true +codegen-units = 1 +panic = "abort" + +[package.metadata.leptos] +# The name used by wasm-bindgen/cargo-leptos for the JS/WASM bundle. Defaults to the crate name +output-name = "vvsite" +# The site root folder is where cargo-leptos generate all output. WARNING: all content of this folder will be erased on a rebuild. Use it in your server setup. +site-root = "target/site" +# The site-root relative folder where all compiled output (JS, WASM and CSS) is written +# Defaults to pkg +site-pkg-dir = "pkg" +# [Optional] The source CSS file. If it ends with .sass or .scss then it will be compiled by dart-sass into CSS. The CSS is optimized by Lightning CSS before being written to //app.css +style-file = "style/main.scss" +# Assets source dir. All files found here will be copied and synchronized to site-root. +# The assets-dir cannot have a sub directory with the same name/path as site-pkg-dir. + +tailwind-input-file = "assets/tailwind/tailwind.css" +# +# Optional. Env: LEPTOS_ASSETS_DIR. +assets-dir = "assets/public" +# The IP and port (ex: 127.0.0.1:3000) where the server serves the content. Use it in your server setup. +site-addr = "0.0.0.0:3000" +# The port to use for automatic reload monitoring +reload-port = 3001 +# [Optional] Command to use when running end2end tests. It will run in the end2end dir. +# [Windows] for non-WSL use "npx.cmd playwright test" +# This binary name can be checked in Powershell with Get-Command npx +end2end-cmd = "npx playwright test" +end2end-dir = "end2end" +# The browserlist query used for optimizing the CSS. +browserquery = "defaults" +# The environment Leptos will run in, usually either "DEV" or "PROD" +env = "DEV" +# The features to use when compiling the bin target +# +# Optional. Can be over-ridden with the command line parameter --bin-features +bin-features = ["ssr"] + +# If the --no-default-features flag should be used when compiling the bin target +# +# Optional. Defaults to false. +bin-default-features = false + +# The features to use when compiling the lib target +# +# Optional. Can be over-ridden with the command line parameter --lib-features +lib-features = ["hydrate"] + +# If the --no-default-features flag should be used when compiling the lib target +# +# Optional. Defaults to false. +lib-default-features = false + +# The profile to use for the lib target when compiling for release +# +# Optional. Defaults to "release". +lib-profile-release = "wasm-release" diff --git a/server_website/vvsite/Dockerfile b/server_website/vvsite/Dockerfile new file mode 100644 index 0000000..fb9ba24 --- /dev/null +++ b/server_website/vvsite/Dockerfile @@ -0,0 +1,9 @@ +FROM archlinux$ +WORKDIR /website$ + +COPY ./site /website/target/site$ +COPY ./vvsite /website/vvsite$ +COPY ./Cargo.toml /website/Cargo.toml$ + +RUN chmod +x /website/vvsite$ +CMD ["/website/vvsite"]$ diff --git a/server_website/vvsite/site/favicon.ico b/server_website/vvsite/site/favicon.ico new file mode 100644 index 0000000..98eb609 Binary files /dev/null and b/server_website/vvsite/site/favicon.ico differ diff --git a/server_website/vvsite/site/pkg/vvsite.css b/server_website/vvsite/site/pkg/vvsite.css new file mode 100644 index 0000000..6ee8a7c --- /dev/null +++ b/server_website/vvsite/site/pkg/vvsite.css @@ -0,0 +1 @@ +body{text-align:center;font-family:sans-serif}*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-variation-settings:normal;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}:host{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-variation-settings:normal;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{color:inherit;border-top-width:1px;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:initial;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button{-webkit-appearance:button;background-color:initial;background-image:none}[type=button]{-webkit-appearance:button;background-color:initial;background-image:none}[type=reset]{-webkit-appearance:button;background-color:initial;background-image:none}[type=submit]{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre,fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{color:#9ca3af;opacity:1}textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder{color:#9ca3af;opacity:1}textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.m-auto{margin:auto}.box-border{box-sizing:border-box}.inline{display:inline}.flex{display:flex}.grid{display:grid}.h-64{height:16rem}.h-\[8vh\]{height:8vh}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[70vh\]{max-height:70vh}.min-h-\[40vh\]{min-height:40vh}.w-full{width:100%}.w-screen{width:100vw}.min-w-\[50vw\]{min-width:50vw}.max-w-\[100vw\]{max-width:100vw}.max-w-\[1300px\]{max-width:1300px}.grow{flex-grow:1}.flex-col{flex-direction:column}.place-content-center{place-content:center}.place-content-stretch{place-content:stretch}.items-center{align-items:center}.justify-center{justify-content:center}.gap-4{gap:1rem}.place-self-center{place-self:center}.rounded-md{border-radius:.375rem}.p-1{padding:.25rem}.p-4{padding:1rem}.p-8{padding:2rem}.py-8{padding-top:2rem;padding-bottom:2rem}.text-center{text-align:center}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-lg{font-size:1.125rem;line-height:1.75rem}.hover\:bg-\[\#889E73ff\]:hover{background-color:#889e73} \ No newline at end of file diff --git a/server_website/vvsite/site/pkg/vvsite.js b/server_website/vvsite/site/pkg/vvsite.js new file mode 100644 index 0000000..9cb9eac --- /dev/null +++ b/server_website/vvsite/site/pkg/vvsite.js @@ -0,0 +1,2 @@ +let e;let n="undefined"!=typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};"undefined"!=typeof TextDecoder&&n.decode();let t=null;function _(){return(null===t||0===t.byteLength)&&(t=new Uint8Array(e.memory.buffer)),t}function r(e,t){return e>>>=0,n.decode(_().subarray(e,e+t))}function i(n,t){return 0!==n?r(n,t):e.__wbindgen_export_0.get(t)}function o(n){let t=e.__externref_table_alloc();return e.__wbindgen_export_0.set(t,n),t}function b(n,t){try{return n.apply(this,t)}catch(t){let n=o(t);e.__wbindgen_exn_store(n)}}function u(e){return null==e}let c=0,a="undefined"!=typeof TextEncoder?new TextEncoder("utf-8"):{encode:()=>{throw Error("TextEncoder not available")}},f="function"==typeof a.encodeInto?function(e,n){return a.encodeInto(e,n)}:function(e,n){let t=a.encode(e);return n.set(t),{read:e.length,written:t.length}};function g(e,n,t){if(void 0===t){let t=a.encode(e),r=n(t.length,1)>>>0;return _().subarray(r,r+t.length).set(t),c=t.length,r}let r=e.length,i=n(r,1)>>>0,o=_(),b=0;for(;b127)break;o[i+b]=n}if(b!==r){0!==b&&(e=e.slice(b)),i=t(i,r,r=b+3*e.length,1)>>>0;let n=f(e,_().subarray(i+b,i+r));b+=n.written,i=t(i,r,b,1)>>>0}return c=b,i}let w=null;function l(){return(null===w||!0===w.buffer.detached||void 0===w.buffer.detached&&w.buffer!==e.memory.buffer)&&(w=new DataView(e.memory.buffer)),w}let d="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>{e.__wbindgen_export_6.get(n.dtor)(n.a,n.b)});function s(n,t,_,r){let i={a:n,b:t,cnt:1,dtor:_},o=(...n)=>{i.cnt++;let t=i.a;i.a=0;try{return r(t,i.b,...n)}finally{0==--i.cnt?(e.__wbindgen_export_6.get(i.dtor)(t,i.b),d.unregister(i)):i.a=t}};return o.original=i,d.register(o,i,i),o}export function hydrate(){e.hydrate()}function y(n,t,_){e.closure260_externref_shim(n,t,_)}function h(n,t){e._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d385688d8140e21(n,t)}function p(n,t){e._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hdf1c359631000d5d(n,t)}function m(n,t,_){e.closure321_externref_shim(n,t,_)}let v=["bytes"],I="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>e.__wbg_intounderlyingbytesource_free(n>>>0,1));export class IntoUnderlyingByteSource{__destroy_into_raw(){let e=this.__wbg_ptr;return this.__wbg_ptr=0,I.unregister(this),e}free(){let n=this.__destroy_into_raw();e.__wbg_intounderlyingbytesource_free(n,0)}get type(){return v[e.intounderlyingbytesource_type(this.__wbg_ptr)]}get autoAllocateChunkSize(){return e.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr)>>>0}start(n){e.intounderlyingbytesource_start(this.__wbg_ptr,n)}pull(n){return e.intounderlyingbytesource_pull(this.__wbg_ptr,n)}cancel(){let n=this.__destroy_into_raw();e.intounderlyingbytesource_cancel(n)}}let x="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>e.__wbg_intounderlyingsink_free(n>>>0,1));export class IntoUnderlyingSink{__destroy_into_raw(){let e=this.__wbg_ptr;return this.__wbg_ptr=0,x.unregister(this),e}free(){let n=this.__destroy_into_raw();e.__wbg_intounderlyingsink_free(n,0)}write(n){return e.intounderlyingsink_write(this.__wbg_ptr,n)}close(){let n=this.__destroy_into_raw();return e.intounderlyingsink_close(n)}abort(n){let t=this.__destroy_into_raw();return e.intounderlyingsink_abort(t,n)}}let A="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>e.__wbg_intounderlyingsource_free(n>>>0,1));export class IntoUnderlyingSource{__destroy_into_raw(){let e=this.__wbg_ptr;return this.__wbg_ptr=0,A.unregister(this),e}free(){let n=this.__destroy_into_raw();e.__wbg_intounderlyingsource_free(n,0)}pull(n){return e.intounderlyingsource_pull(this.__wbg_ptr,n)}cancel(){let n=this.__destroy_into_raw();e.intounderlyingsource_cancel(n)}}async function S(e,n){if("function"==typeof Response&&e instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(e,n)}catch(n){if("application/wasm"!=e.headers.get("Content-Type"))console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",n);else throw n}let t=await e.arrayBuffer();return await WebAssembly.instantiate(t,n)}{let t=await WebAssembly.instantiate(e,n);return t instanceof WebAssembly.Instance?{instance:t,module:e}:t}}function R(){let n={};return n.wbg={},n.wbg.__wbg_addEventListener_ad9617755da8fbe8=function(){return b(function(e,n,t,_){var r=i(n,t);e.addEventListener(r,_)},arguments)},n.wbg.__wbg_altKey_d2ad93ef54deb903=function(e){return e.altKey},n.wbg.__wbg_appendChild_daddabaedb4a1728=function(){return b(function(e,n){return e.appendChild(n)},arguments)},n.wbg.__wbg_append_1e71048609c4c149=function(){return b(function(e,n){e.append(n)},arguments)},n.wbg.__wbg_before_14893f35be58ad51=function(){return b(function(e,n){e.before(n)},arguments)},n.wbg.__wbg_before_a5debbbcdc74ee52=function(){return b(function(e,n){e.before(n)},arguments)},n.wbg.__wbg_body_39801f8e28a17e0d=function(e){let n=e.body;return u(n)?0:o(n)},n.wbg.__wbg_buffer_4cc4466b579d16b4=function(e){return e.buffer},n.wbg.__wbg_buffer_71667b1101df19da=function(e){return e.buffer},n.wbg.__wbg_button_e8c44aa42b50bef9=function(e){return e.button},n.wbg.__wbg_byobRequest_9dd6d13eb365e223=function(e){let n=e.byobRequest;return u(n)?0:o(n)},n.wbg.__wbg_byteLength_e84fb9e4a2940d2c=function(e){return e.byteLength},n.wbg.__wbg_byteOffset_05ea0b08782f01bd=function(e){return e.byteOffset},n.wbg.__wbg_call_75b89300dd530ca6=function(){return b(function(e,n,t){return e.call(n,t)},arguments)},n.wbg.__wbg_call_d68488931693e6ee=function(){return b(function(e,n){return e.call(n)},arguments)},n.wbg.__wbg_childNodes_db685c63dbcd5537=function(e){return e.childNodes},n.wbg.__wbg_cloneNode_b3ad5fe78182a3e7=function(){return b(function(e){return e.cloneNode()},arguments)},n.wbg.__wbg_close_2c98beee2b59af63=function(){return b(function(e){e.close()},arguments)},n.wbg.__wbg_close_f825000f2241f096=function(){return b(function(e){e.close()},arguments)},n.wbg.__wbg_composedPath_ee4f72591e0d0f75=function(e){return e.composedPath()},n.wbg.__wbg_createComment_e4c00ebde70478b2=function(e,n,t){var _=i(n,t);return e.createComment(_)},n.wbg.__wbg_createDocumentFragment_d041a9d2f85d2ed1=function(e){return e.createDocumentFragment()},n.wbg.__wbg_createElement_51ffea4765cb1cc5=function(){return b(function(e,n,t){var _=i(n,t);return e.createElement(_)},arguments)},n.wbg.__wbg_createTextNode_86708483bc3c5132=function(e,n,t){var _=i(n,t);return e.createTextNode(_)},n.wbg.__wbg_createTreeWalker_a48515596b8beef2=function(){return b(function(e,n,t){return e.createTreeWalker(n,t>>>0)},arguments)},n.wbg.__wbg_ctrlKey_b18a47cac80f5ed7=function(e){return e.ctrlKey},n.wbg.__wbg_dataset_d2cf01c763ceb005=function(e){return e.dataset},n.wbg.__wbg_decodeURIComponent_b5e7c28797af50ab=function(){return b(function(e,n){return decodeURIComponent(i(e,n))},arguments)},n.wbg.__wbg_decodeURI_708ceea9a5b1301e=function(){return b(function(e,n){return decodeURI(i(e,n))},arguments)},n.wbg.__wbg_defaultPrevented_732aa296a00ba0f6=function(e){return e.defaultPrevented},n.wbg.__wbg_document_7689f46a8f647c96=function(e){let n=e.document;return u(n)?0:o(n)},n.wbg.__wbg_done_3ca5b09e8598078d=function(e){return e.done},n.wbg.__wbg_enqueue_8a48484465436b3b=function(){return b(function(e,n){e.enqueue(n)},arguments)},n.wbg.__wbg_entries_d873dde863e50b8c=function(e){return Object.entries(e)},n.wbg.__wbg_error_2ca63459aa969937=function(e){console.error(e)},n.wbg.__wbg_error_7534b8e9a36f1ab4=function(n,t){var _=i(n,t);0!==n&&e.__wbindgen_free(n,t,1),console.error(_)},n.wbg.__wbg_exec_7230cd5c145b872e=function(e,n,t){var _=i(n,t);let r=e.exec(_);return u(r)?0:o(r)},n.wbg.__wbg_getAttribute_876366f2916a83fc=function(n,t,_,r){var o=i(_,r);let b=t.getAttribute(o);var a=u(b)?0:g(b,e.__wbindgen_malloc,e.__wbindgen_realloc),f=c;l().setInt32(n+4,f,!0),l().setInt32(n+0,a,!0)},n.wbg.__wbg_getElementById_ce95590ef98fe114=function(e,n,t){var _=i(n,t);let r=e.getElementById(_);return u(r)?0:o(r)},n.wbg.__wbg_get_726e3873086e7183=function(n,t,_,r){let o=t[i(_,r)];var b=u(o)?0:g(o,e.__wbindgen_malloc,e.__wbindgen_realloc),a=c;l().setInt32(n+4,a,!0),l().setInt32(n+0,b,!0)},n.wbg.__wbg_get_c122b1d576cf1fdb=function(e,n){return e[n>>>0]},n.wbg.__wbg_get_ddd82e34e6366fb9=function(){return b(function(e,n){return Reflect.get(e,n)},arguments)},n.wbg.__wbg_getwithrefkey_1dc361bd10053bfe=function(e,n){return e[n]},n.wbg.__wbg_globalThis_59c7794d9413986f=function(){return b(function(){return globalThis.globalThis},arguments)},n.wbg.__wbg_global_04c81bad83a72129=function(){return b(function(){return global.global},arguments)},n.wbg.__wbg_hasAttribute_10d61da464139fd3=function(e,n,t){var _=i(n,t);return e.hasAttribute(_)},n.wbg.__wbg_hash_1b8b81a17fbce53f=function(){return b(function(n,t){let _=g(t.hash,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},arguments)},n.wbg.__wbg_hash_bca72f76a3178bc8=function(n,t){let _=g(t.hash,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_head_f593be76595faa59=function(e){let n=e.head;return u(n)?0:o(n)},n.wbg.__wbg_history_28c9f6bada41fa0e=function(){return b(function(e){return e.history},arguments)},n.wbg.__wbg_href_02e76f823c19d30c=function(n,t){let _=g(t.href,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_href_fe620cbb08310f18=function(n,t){let _=g(t.href,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_instanceof_ArrayBuffer_36214dbc6ea8dd3d=function(e){let n;try{n=e instanceof ArrayBuffer}catch(e){n=!1}return n},n.wbg.__wbg_instanceof_HtmlAnchorElement_93ffbf43e94800f9=function(e){let n;try{n=e instanceof HTMLAnchorElement}catch(e){n=!1}return n},n.wbg.__wbg_instanceof_Uint8Array_0d898f7981fe0a2d=function(e){let n;try{n=e instanceof Uint8Array}catch(e){n=!1}return n},n.wbg.__wbg_instanceof_Window_47f723ed0409d724=function(e){let n;try{n=e instanceof Window}catch(e){n=!1}return n},n.wbg.__wbg_isArray_435f9cb9abc7eccc=function(e){return Array.isArray(e)},n.wbg.__wbg_isSafeInteger_2817b2c8ebdd29d2=function(e){return Number.isSafeInteger(e)},n.wbg.__wbg_is_c0f4e2085c8d91e1=function(e,n){return Object.is(e,n)},n.wbg.__wbg_item_e4865fb0fce356b0=function(e,n){let t=e.item(n>>>0);return u(t)?0:o(t)},n.wbg.__wbg_iterator_2a6b115668862130=function(){return Symbol.iterator},n.wbg.__wbg_length_b52c3d528b88468e=function(e){return e.length},n.wbg.__wbg_length_cc2c33deb047a05b=function(e){return e.length},n.wbg.__wbg_length_e9123d1e4db12534=function(e){return e.length},n.wbg.__wbg_location_d103e836c52d0920=function(e){return e.location},n.wbg.__wbg_metaKey_139fd4bb4a7f3fdc=function(e){return e.metaKey},n.wbg.__wbg_new_10003836f2677621=function(e,n,t,_){return new RegExp(i(e,n),i(t,_))},n.wbg.__wbg_new_51fd3aeaa6d3d03f=function(n,t){try{var _={a:n,b:t};return new Promise((n,t)=>{let r=_.a;_.a=0;try{var i;return i=_.b,void e.closure338_externref_shim(r,i,n,t)}finally{_.a=r}})}finally{_.a=_.b=0}},n.wbg.__wbg_new_5bd3cfec88bd010e=function(e,n){return Error(i(e,n))},n.wbg.__wbg_new_8a6f238a6ece86ea=function(){return Error()},n.wbg.__wbg_new_9ed4506807911440=function(e){return new Uint8Array(e)},n.wbg.__wbg_newnoargs_fe7e106c48aadd7e=function(e,n){return Function(i(e,n))},n.wbg.__wbg_newwithbase_3e89facdc4b45c72=function(){return b(function(e,n,t,_){return new URL(i(e,n),i(t,_))},arguments)},n.wbg.__wbg_newwithbyteoffsetandlength_a51b517eb0e8fbf4=function(e,n,t){return new Uint8Array(e,n>>>0,t>>>0)},n.wbg.__wbg_nextNode_43077ba4421d37bb=function(){return b(function(e){let n=e.nextNode();return u(n)?0:o(n)},arguments)},n.wbg.__wbg_nextSibling_5dd0879ef893f708=function(e){let n=e.nextSibling;return u(n)?0:o(n)},n.wbg.__wbg_next_86c8f7dfb19a94eb=function(){return b(function(e){return e.next()},arguments)},n.wbg.__wbg_next_b39104aeda52ac60=function(e){return e.next},n.wbg.__wbg_origin_33e525b3abd804cf=function(){return b(function(n,t){let _=g(t.origin,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},arguments)},n.wbg.__wbg_origin_81f4bd192488990e=function(n,t){let _=g(t.origin,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_pathname_12a663b40d81039a=function(n,t){let _=g(t.pathname,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_pathname_f4c73464379abf9e=function(){return b(function(n,t){let _=g(t.pathname,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},arguments)},n.wbg.__wbg_preventDefault_7cd87fa71683fc8f=function(e){e.preventDefault()},n.wbg.__wbg_previousSibling_f05e5f738946758c=function(e){let n=e.previousSibling;return u(n)?0:o(n)},n.wbg.__wbg_pushState_aa3f82bc57f19dd0=function(){return b(function(e,n,t,_,r,o){var b=i(t,_),u=i(r,o);e.pushState(n,b,u)},arguments)},n.wbg.__wbg_querySelectorAll_052eac35cdb76210=function(){return b(function(e,n,t){var _=i(n,t);return e.querySelectorAll(_)},arguments)},n.wbg.__wbg_querySelector_ab5b6a4f61d535d5=function(){return b(function(e,n,t){var _=i(n,t);let r=e.querySelector(_);return u(r)?0:o(r)},arguments)},n.wbg.__wbg_queueMicrotask_5a8a9131f3f0b37b=function(e){return e.queueMicrotask},n.wbg.__wbg_queueMicrotask_6d79674585219521=function(e){queueMicrotask(e)},n.wbg.__wbg_removeAttribute_2fd4894609c8ce06=function(){return b(function(e,n,t){var _=i(n,t);e.removeAttribute(_)},arguments)},n.wbg.__wbg_removeChild_28f5cd5ebb18ae8e=function(){return b(function(e,n){return e.removeChild(n)},arguments)},n.wbg.__wbg_removeEventListener_f420b4f37f515116=function(){return b(function(e,n,t,_){var r=i(n,t);e.removeEventListener(r,_)},arguments)},n.wbg.__wbg_remove_52bfcaff25d6cf50=function(e){e.remove()},n.wbg.__wbg_remove_844123e436d13065=function(e){e.remove()},n.wbg.__wbg_replaceState_0edd916282b64c6a=function(){return b(function(e,n,t,_,r,o){var b=i(t,_),u=i(r,o);e.replaceState(n,b,u)},arguments)},n.wbg.__wbg_requestAnimationFrame_c63a6b8ad5f85d24=function(){return b(function(e,n){return e.requestAnimationFrame(n)},arguments)},n.wbg.__wbg_resolve_33aaa312c39e688c=function(e){return Promise.resolve(e)},n.wbg.__wbg_respond_442db8b929a98e76=function(){return b(function(e,n){e.respond(n>>>0)},arguments)},n.wbg.__wbg_scrollIntoView_7b81853ddfc9f282=function(e){e.scrollIntoView()},n.wbg.__wbg_scrollTo_10dc674a440a3169=function(e,n,t){e.scrollTo(n,t)},n.wbg.__wbg_searchParams_b91890aed3e49590=function(e){return e.searchParams},n.wbg.__wbg_search_89e7e03373553f0b=function(n,t){let _=g(t.search,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_search_9766a64e4a830960=function(){return b(function(n,t){let _=g(t.search,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},arguments)},n.wbg.__wbg_self_c9a63b952bd22cbd=function(){return b(function(){return self.self},arguments)},n.wbg.__wbg_setAttribute_3d1326b2d681f50e=function(){return b(function(e,n,t,_,r){var o=i(n,t),b=i(_,r);e.setAttribute(o,b)},arguments)},n.wbg.__wbg_set_e8d9380e866a1e41=function(e,n,t){e.set(n,t>>>0)},n.wbg.__wbg_setdata_5ba64d5808cc682a=function(e,n,t){var _=i(n,t);e.data=_},n.wbg.__wbg_sethref_b50b9cb99365bb8d=function(){return b(function(e,n,t){var _=i(n,t);e.href=_},arguments)},n.wbg.__wbg_setinnerHTML_412032fa3570c106=function(e,n,t){var _=i(n,t);e.innerHTML=_},n.wbg.__wbg_settextContent_8aa5fee2cdfef876=function(e,n,t){var _=i(n,t);e.textContent=_},n.wbg.__wbg_shiftKey_15a826ae86780b66=function(e){return e.shiftKey},n.wbg.__wbg_stack_0ed75d68575b0f3c=function(n,t){let _=g(t.stack,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_state_700a50d8e8718898=function(){return b(function(e){return e.state},arguments)},n.wbg.__wbg_target_07ff857af641679a=function(n,t){let _=g(t.target,e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbg_textContent_9d6d40582d0c5e46=function(n,t){let _=t.textContent;var r=u(_)?0:g(_,e.__wbindgen_malloc,e.__wbindgen_realloc),i=c;l().setInt32(n+4,i,!0),l().setInt32(n+0,r,!0)},n.wbg.__wbg_then_acd4f2d41ed1cf58=function(e,n){return e.then(n)},n.wbg.__wbg_value_f82ca5432417c8ff=function(e){return e.value},n.wbg.__wbg_view_f0ef1c95fdf68f4a=function(e){let n=e.view;return u(n)?0:o(n)},n.wbg.__wbg_warn_f70d9f1be6c62e43=function(e){console.warn(e)},n.wbg.__wbg_window_81304a10d2638125=function(){return b(function(){return window.window},arguments)},n.wbg.__wbindgen_as_number=function(e){return+e},n.wbg.__wbindgen_boolean_get=function(e){return"boolean"==typeof e?+!!e:2},n.wbg.__wbindgen_cb_drop=function(e){let n=e.original;return 1==n.cnt--&&(n.a=0,!0)},n.wbg.__wbindgen_closure_wrapper1600=function(e,n,t){return s(e,n,259,y)},n.wbg.__wbindgen_closure_wrapper1602=function(e,n,t){return s(e,n,259,h)},n.wbg.__wbindgen_closure_wrapper1657=function(e,n,t){return s(e,n,266,p)},n.wbg.__wbindgen_closure_wrapper2117=function(e,n,t){return s(e,n,322,m)},n.wbg.__wbindgen_debug_string=function(n,t){let _=g(function e(n){let t;let _=typeof n;if("number"==_||"boolean"==_||null==n)return`${n}`;if("string"==_)return`"${n}"`;if("symbol"==_){let e=n.description;return null==e?"Symbol":`Symbol(${e})`}if("function"==_){let e=n.name;return"string"==typeof e&&e.length>0?`Function(${e})`:"Function"}if(Array.isArray(n)){let t=n.length,_="[";t>0&&(_+=e(n[0]));for(let r=1;r1))return toString.call(n);if("Object"==(t=r[1]))try{return"Object("+JSON.stringify(n)+")"}catch(e){return"Object"}return n instanceof Error?`${n.name}: ${n.message} +${n.stack}`:t}(t),e.__wbindgen_malloc,e.__wbindgen_realloc),r=c;l().setInt32(n+4,r,!0),l().setInt32(n+0,_,!0)},n.wbg.__wbindgen_error_new=function(e,n){return Error(r(e,n))},n.wbg.__wbindgen_in=function(e,n){return e in n},n.wbg.__wbindgen_init_externref_table=function(){let n=e.__wbindgen_export_0,t=n.grow(4);n.set(0,void 0),n.set(t+0,void 0),n.set(t+1,null),n.set(t+2,!0),n.set(t+3,!1)},n.wbg.__wbindgen_is_function=function(e){return"function"==typeof e},n.wbg.__wbindgen_is_null=function(e){return null===e},n.wbg.__wbindgen_is_object=function(e){return"object"==typeof e&&null!==e},n.wbg.__wbindgen_is_string=function(e){return"string"==typeof e},n.wbg.__wbindgen_is_undefined=function(e){return void 0===e},n.wbg.__wbindgen_jsval_eq=function(e,n){return e===n},n.wbg.__wbindgen_jsval_loose_eq=function(e,n){return e==n},n.wbg.__wbindgen_memory=function(){return e.memory},n.wbg.__wbindgen_number_get=function(e,n){let t="number"==typeof n?n:void 0;l().setFloat64(e+8,u(t)?0:t,!0),l().setInt32(e+0,!u(t),!0)},n.wbg.__wbindgen_string_get=function(n,t){let _="string"==typeof t?t:void 0;var r=u(_)?0:g(_,e.__wbindgen_malloc,e.__wbindgen_realloc),i=c;l().setInt32(n+4,i,!0),l().setInt32(n+0,r,!0)},n.wbg.__wbindgen_string_new=function(e,n){return r(e,n)},n.wbg.__wbindgen_throw=function(e,n){throw Error(r(e,n))},n}function k(n,_){return e=n.exports,T.__wbindgen_wasm_module=_,w=null,t=null,e.__wbindgen_start(),e}function E(n){if(void 0!==e)return e;void 0!==n&&(Object.getPrototypeOf(n)===Object.prototype?{module:n}=n:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=R();return n instanceof WebAssembly.Module||(n=new WebAssembly.Module(n)),k(new WebAssembly.Instance(n,t),n)}async function T(n){if(void 0!==e)return e;void 0!==n&&(Object.getPrototypeOf(n)===Object.prototype?{module_or_path:n}=n:console.warn("using deprecated parameters for the initialization function; pass a single object instead"));let t=R();("string"==typeof n||"function"==typeof Request&&n instanceof Request||"function"==typeof URL&&n instanceof URL)&&(n=fetch(n));let{instance:_,module:r}=await S(await n,t);return k(_,r)}export default T;export{E as initSync}; \ No newline at end of file diff --git a/server_website/vvsite/site/pkg/vvsite.wasm b/server_website/vvsite/site/pkg/vvsite.wasm new file mode 100644 index 0000000..07ba5a9 Binary files /dev/null and b/server_website/vvsite/site/pkg/vvsite.wasm differ diff --git a/server_website/vvsite/site/website.css b/server_website/vvsite/site/website.css new file mode 100644 index 0000000..9c87464 --- /dev/null +++ b/server_website/vvsite/site/website.css @@ -0,0 +1,238 @@ +body { + margin: 0; + padding: 0; + font-family: Arial, sans-serif; + background-color: #F4D793; + color: #FFF6DA; +} + +.overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 999; +} + +/* The floating window */ +.floating-window { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + min-width: 50%; + max-width: 80%; + max-height: 90vh; + background: #fff; + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + z-index: 1000; + box-sizing: border-box; + overflow-y: auto; + padding: 20px; +} + +.floating-window header { + font-weight: bold; + max-width: 80%; + border-bottom: 1px solid #ddd; + margin-bottom: 10px; + padding-bottom: 10px; +} + +.floating-window .close-btn { + position: absolute; + top: 5px; + right: 5px; + width: 20px; + height: 20px; + cursor: pointer; + line-height: 1; +} + +.dialog { + top: 50%; + left: 50%; + -webkit-transform: translateX(-50%) translateY(-50%); + -moz-transform: translateX(-50%) translateY(-50%); + -ms-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%); +} + +/* Style the dropdown container */ +.dropdown { + position: relative; + display: inline-block; +} + +/* Style the dropdown button */ +.dropbtn { + background-color: #4caf50; + color: white; + padding: 16px; + font-size: 16px; + border: none; + cursor: pointer; +} + +/* Style the dropdown content (hidden by default) */ +.dropdown-content { + display: block; + position: absolute; + border-radius: 12px; + background-color: #f9f9f9; + min-width: 160px; + box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2); + z-index: 1; +} + +/* Style the links inside the dropdown */ +.dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; +} + +/* Change color of links when hovered */ +.dropdown-content a:hover { + background-color: #f1f1f1; +} + +/* Show the dropdown menu when hovering over the dropdown button */ + +/* Change the button color when hovering */ +.dropdown:hover .dropbtn { + background-color: #3e8e41; +} +/*////////////////////////////////////////////////////////////////////////////*/ + +/* TABLE */ +/* .table { + display: table; + width: auto; + border-collapse: collapse; + max-width: 100%; + grid-gap:; + table-layout: auto; + border-radius: 12px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); +} + +.table-row { + display: table-row; +} + +.table-head, +.table-cell { + display: table-cell; + margin: 4; + padding: 1em 1.5em; + text-align: center; + border: 1px solid #e0e0e0; + border-radius: 12px; + width: auto; +} + +.table-head { + background-color: #f5f5f5; + font-weight: bold; +} + +.table-cell { + background-color: #fff; + transition: background-color 0.3s ease; +} + +.table-row:nth-child(even) .table-cell { + background-color: #fafafa; +} + +.table-row:hover .table-cell { + background-color: #f0f0f0; +} */ + +.background-div { + /* background-color: rgba(235, 67, 0, 50); */ + background: #f343048a; +} + +/* Container as a grid instead of table */ +.table { + display: grid; + /* If you know you have exactly 3 columns, specify them: */ + /* grid-template-columns: repeat(3, 1fr); */ + /* or, for a variable number of columns: */ + /* grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); */ + max-width: 100%; + margin: 20px 0; + + /* Rounded corners and shadow */ + border-radius: 12px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + + /* Optional gap between cells */ +} + +/* Each "row" is just a grouping for hover/striped logic */ +.table-row { + /* We use 'display: contents' so the child .table-head / .table-cell + items will flow into the parent grid columns. */ + display: contents; + overflow: hidden; +} + +/* Common cell styles */ +.table-head, +.table-cell { + /* You can remove margin if you prefer the cells to touch */ + display: flex; + /* margin: 4px; */ + padding: 0.25em 0.25em; + text-align: center; + font-size: 12; + text-wrap: wrap; + font-weight: 500; + /* Keep the borders for a cell-like feel */ + border: 1px solid #a0a0a0; + /* border-radius: 12px; */ + place-items: center; + + /* Smooth text wrapping in columns */ + /* width: auto; */ +} + +/* Header cell styling - Autumn accent */ +.table-head { + background-color: #f9dec9; /* light warm-orange shade */ + font-weight: bold; +} + +/* Body cell styling - Autumn base color */ +.table-cell { + overflow: hidden; + background-color: #fdf3ee; /* subtle near-white peach */ + transition: background-color 0.3s ease; +} + +/* Striped rows: every even 'table-row' uses a different shade */ +.table-row:nth-of-type(even) .table-cell { + background-color: #fce8d8; /* pale orange-brown */ +} + +/* Row hover effect - a slightly darker shade */ +.table-row:hover .table-cell { + background-color: #f8dcc2; /* warm peach on hover */ +} +/* Pointer effect for interactive cells */ +.point { + cursor: pointer; + transition: background-color 0.3s ease; +} + +.point:hover { + background-color: #e9e9e9; +} diff --git a/server_website/vvsite/vvsite b/server_website/vvsite/vvsite new file mode 100755 index 0000000..bc32c8b Binary files /dev/null and b/server_website/vvsite/vvsite differ diff --git a/vvsite/Dockerfile b/vvsite/Dockerfile index 2035d61..23577f8 100644 --- a/vvsite/Dockerfile +++ b/vvsite/Dockerfile @@ -2,7 +2,7 @@ FROM archlinux WORKDIR /website COPY ./target/site /website/target/site -COPY ./target/debug/vvsite /website/vvsite +COPY ./target/release/vvsite /website/vvsite COPY ./Cargo.toml /website/Cargo.toml RUN chmod +x /website/vvsite diff --git a/vvsite/src/website/client/pages/minishell.rs b/vvsite/src/website/client/pages/minishell.rs index bd34c02..81478b9 100644 --- a/vvsite/src/website/client/pages/minishell.rs +++ b/vvsite/src/website/client/pages/minishell.rs @@ -8,7 +8,7 @@ pub fn MinishellPage() -> impl IntoView{

"The (mini) Shell"

-