first push to new repo
This commit is contained in:
parent
9ee16bb724
commit
afa223b09f
@ -1 +0,0 @@
|
||||
{"creation_dt": "2025-02-18T14:08:30Z", "creation_host": "d9ae498e3528"}
|
||||
@ -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"}
|
||||
@ -1 +0,0 @@
|
||||
{"body": {}, "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/2236033565"}
|
||||
27
compose.yaml
27
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"
|
||||
|
||||
@ -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 && \
|
||||
|
||||
BIN
minishell/bin/minishell
Executable file
BIN
minishell/bin/minishell
Executable file
Binary file not shown.
@ -6,7 +6,7 @@
|
||||
# By: anarama <anarama@student.42.fr> +#+ +:+ +#+ #
|
||||
# +#+#+#+#+#+ +#+ #
|
||||
# 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)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -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
|
||||
|
||||
|
||||
28
nginx/certs/localhost-key.pem
Normal file
28
nginx/certs/localhost-key.pem
Normal file
@ -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-----
|
||||
24
nginx/certs/localhost.pem
Normal file
24
nginx/certs/localhost.pem
Normal file
@ -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-----
|
||||
149
nginx/nginx.conf
149
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
9
remote_config/Dockerfile
Normal file
9
remote_config/Dockerfile
Normal file
@ -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"]$
|
||||
25
remote_config/deploy.sh
Executable file
25
remote_config/deploy.sh
Executable file
@ -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
|
||||
|
||||
56
remote_config/nginx.conf
Normal file
56
remote_config/nginx.conf
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
58
server_website/compose.yaml
Normal file
58
server_website/compose.yaml
Normal file
@ -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
|
||||
19
server_website/minishell/Dockerfile
Normal file
19
server_website/minishell/Dockerfile
Normal file
@ -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"]
|
||||
BIN
server_website/minishell/bin/minishell
Executable file
BIN
server_website/minishell/bin/minishell
Executable file
Binary file not shown.
54
server_website/minishell/entrypoint.sh
Normal file
54
server_website/minishell/entrypoint.sh
Normal file
@ -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
|
||||
28
server_website/nginx/certs/localhost-key.pem
Normal file
28
server_website/nginx/certs/localhost-key.pem
Normal file
@ -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-----
|
||||
24
server_website/nginx/certs/localhost.pem
Normal file
24
server_website/nginx/certs/localhost.pem
Normal file
@ -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-----
|
||||
758
server_website/nginx/html/css/output.css
Normal file
758
server_website/nginx/html/css/output.css
Normal file
@ -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: "<length>";
|
||||
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;
|
||||
}
|
||||
1
server_website/nginx/html/css/style.css
Normal file
1
server_website/nginx/html/css/style.css
Normal file
@ -0,0 +1 @@
|
||||
@import "tailwindcss";
|
||||
47
server_website/nginx/html/index.html
Normal file
47
server_website/nginx/html/index.html
Normal file
@ -0,0 +1,47 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Login</title>
|
||||
<!-- Tailwind CSS CDN -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
</head>
|
||||
<body class="bg-gray-100 flex items-center justify-center h-screen">
|
||||
<div class="bg-white p-8 rounded shadow-md w-full max-w-md">
|
||||
<h2 class="text-2xl font-bold mb-6 text-center">Login</h2>
|
||||
<form action="/login" method="POST">
|
||||
<div class="mb-4">
|
||||
<label for="email" class="block text-gray-700">Email</label>
|
||||
<input
|
||||
type="email"
|
||||
id="email"
|
||||
name="email"
|
||||
placeholder="you@example.com"
|
||||
class="mt-1 w-full px-3 py-2 border rounded focus:outline-none focus:ring focus:border-blue-300"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="password" class="block text-gray-700">Password</label>
|
||||
<input
|
||||
type="password"
|
||||
id="password"
|
||||
name="userpassword"
|
||||
placeholder="********"
|
||||
class="mt-1 w-full px-3 py-2 border rounded focus:outline-none focus:ring focus:border-blue-300"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div class="mb-4 flex items-center">
|
||||
<input type="checkbox" id="remember" name="remember" class="mr-2" />
|
||||
<label for="remember" class="text-gray-700">Remember me</label>
|
||||
</div>
|
||||
<button type="submit" class="w-full bg-blue-500 text-white py-2 rounded hover:bg-blue-600 transition">
|
||||
Login
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
56
server_website/nginx/nginx.conf
Normal file
56
server_website/nginx/nginx.conf
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
93
server_website/vvsite/Cargo.toml
Normal file
93
server_website/vvsite/Cargo.toml
Normal file
@ -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 <site-root>/<site-pkg>/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"
|
||||
9
server_website/vvsite/Dockerfile
Normal file
9
server_website/vvsite/Dockerfile
Normal file
@ -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"]$
|
||||
BIN
server_website/vvsite/site/favicon.ico
Normal file
BIN
server_website/vvsite/site/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 97 KiB |
1
server_website/vvsite/site/pkg/vvsite.css
Normal file
1
server_website/vvsite/site/pkg/vvsite.css
Normal file
File diff suppressed because one or more lines are too long
2
server_website/vvsite/site/pkg/vvsite.js
Normal file
2
server_website/vvsite/site/pkg/vvsite.js
Normal file
File diff suppressed because one or more lines are too long
BIN
server_website/vvsite/site/pkg/vvsite.wasm
Normal file
BIN
server_website/vvsite/site/pkg/vvsite.wasm
Normal file
Binary file not shown.
238
server_website/vvsite/site/website.css
Normal file
238
server_website/vvsite/site/website.css
Normal file
@ -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;
|
||||
}
|
||||
BIN
server_website/vvsite/vvsite
Executable file
BIN
server_website/vvsite/vvsite
Executable file
Binary file not shown.
@ -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
|
||||
|
||||
@ -8,7 +8,7 @@ pub fn MinishellPage() -> impl IntoView{
|
||||
<div class="flex h-[8vh] place-content-stretch">
|
||||
<h2 class="text-4xl py-8">"The (mini) Shell"</h2>
|
||||
</div>
|
||||
<iframe src="https://remoteserver.vps.webdock.cloud/minishell/vnc" class="place-self-center" width="800" height="600" />
|
||||
<iframe src="https://victorvobis.mooo.com/minishell/vnc" class="place-self-center" width="800" height="600" />
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user