first push to new repo

This commit is contained in:
victor 2025-05-19 10:17:58 +02:00
parent 9ee16bb724
commit afa223b09f
36 changed files with 1577 additions and 156 deletions

View File

@ -1 +0,0 @@
{"creation_dt": "2025-02-18T14:08:30Z", "creation_host": "d9ae498e3528"}

View File

@ -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"}

View File

@ -1 +0,0 @@
{"body": {}, "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/2236033565"}

View File

@ -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"

View File

@ -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

Binary file not shown.

View File

@ -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)

View File

@ -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

View 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
View 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-----

View File

@ -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
View 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
View 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
View 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;
}
}
}

View 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

View 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"]

Binary file not shown.

View 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

View 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-----

View 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-----

View 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;
}

View File

@ -0,0 +1 @@
@import "tailwindcss";

View 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>

View 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;
}
}
}

View 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"

View 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"]$

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View 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

Binary file not shown.

View File

@ -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

View File

@ -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>
}
}