commit 2381d199750b03f431723c7757f9ec378ee407d8 parent b828239d786e3a1793c2d506a2d2571af12fb319 Author: Damian Myrda <damian@prime8.dev> Date: Tue, 6 Jan 2026 09:38:30 -0600 Simplify project structure for cloud deployment Diffstat:
38 files changed, 68 insertions(+), 544 deletions(-)
diff --git a/.gitmodules b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "git/theme"] - path = git/theme - url = https://github.com/CBenoit/gitweb-dark-theme.git diff --git a/Dockerfile b/Dockerfile @@ -5,8 +5,8 @@ RUN ["zola", "build"] FROM caddy:builder AS caddy RUN xcaddy build \ - --with github.com/caddyserver/cache-handler \ - --with github.com/mholt/caddy-ratelimit + --with github.com/caddyserver/cache-handler \ + --with github.com/mholt/caddy-ratelimit FROM caddy:latest COPY --from=caddy /usr/bin/caddy /usr/bin/caddy diff --git a/README.md b/README.md @@ -1,15 +0,0 @@ -# p8d - -This is my website located at prime8.dev - -## download - -Run `sh <(curl -s https://raw.githubusercontent.com/moncheeta/p8d/master/download.sh)` to download the necessary files. - -## setup - -First of all, make sure you copied your ssh public key on the server. If not, you can use the `ssh-copy-id` command. Next, run `setup.sh` to properly setup all the services. Afterwards, it's recommended to restart the server. - -## run - -Run `docker compose up -d` to start up all the services in the background. You can stop them by running `docker compose down`. diff --git a/caddy b/caddy @@ -1,127 +0,0 @@ -{ - cache -} - -# Root -prime8.dev { - redir https://www.prime8.dev{uri} 301 - - # Security - header { - Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Enforce HTTPS for 1 year - X-Frame-Options "DENY" # Prevent embedding - -Server # Remove the Server header - Permissions-Policy "geolocation=(), microphone=(), camera=()" # No permissions - X-Content-Type-Options "nosniff" # Prevent MIME-type sniffing - Referrer-Policy "no-referrer-when-downgrade" # Control referrer behavior - } - tls damian@prime8.dev -} - -# Main Site -www.prime8.dev { - root * /web/ - file_server - try_files {path} {path}.html - - # 404 Page Handling - handle_errors { - @404 { - expression {http.error.status_code} == 404 - } - rewrite @404 /404.html - - @429 { - expression {http.error.status_code} == 429 - } - rewrite @429 /429.html - - @500 { - expression {http.error.status_code} == 500 - } - rewrite @500 /500.html - - file_server - } - - # Caching - cache - header /static/* { - Cache-Control "public, max-age=86400; immutable" # Cache for 1 day - } - - # Security - header { - Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Enforce HTTPS for 1 year - X-Frame-Options "DENY" # Prevent embedding - -Server # Remove the Server header - Permissions-Policy "geolocation=(), microphone=(), camera=()" # No permissions - X-Content-Type-Options "nosniff" # Prevent MIME-type sniffing - Referrer-Policy "no-referrer-when-downgrade" # Control referrer behavior - } - tls damian@prime8.dev -} - -# Mail Server -mail.prime8.dev { - header { - X-Robots-Tag "noindex, nofollow" # Prevent search engine indexing - - # Security - Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Enforce HTTPS for 1 year - X-Frame-Options "DENY" # Prevent embedding - -Server # Remove the Server header - Permissions-Policy "geolocation=(), microphone=(), camera=()" # No permissions - X-Content-Type-Options "nosniff" # Prevent MIME-type sniffing - Referrer-Policy "no-referrer-when-downgrade" # Control referrer behavior - } - tls damian@prime8.dev -} - -# Git Server -git.prime8.dev { - reverse_proxy http://gitweb:80 - - # Caching - cache - header /static/* { - Cache-Control "public, max-age=86400; immutable" # Cache for 1 day - } - - header { - X-Robots-Tag "noindex, nofollow" # Prevent search engine indexing - - # Security - Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Enforce HTTPS for 1 year - X-Frame-Options "DENY" # Prevent embedding - -Server # Remove the Server header - Permissions-Policy "geolocation=(), microphone=(), camera=()" # No permissions - X-Content-Type-Options "nosniff" # Prevent MIME-type sniffing - Referrer-Policy "no-referrer-when-downgrade" # Control referrer behavior - } - tls damian@prime8.dev -} - -# CSC Website -csc.prime8.dev { - reverse_proxy http://csc:80 - - # Caching - cache - header /static/* { - Cache-Control "public, max-age=86400; immutable" # Cache for 1 day - } - - header { - X-Robots-Tag "noindex, nofollow" # Prevent search engine indexing - - # Security - Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Enforce HTTPS for 1 year - X-Frame-Options "DENY" # Prevent embedding - -Server # Remove the Server header - Permissions-Policy "geolocation=(), microphone=(), camera=()" # No permissions - X-Content-Type-Options "nosniff" # Prevent MIME-type sniffing - Referrer-Policy "no-referrer-when-downgrade" # Control referrer behavior - } - tls damian@prime8.dev -} -\ No newline at end of file diff --git a/cloud_config.yml b/cloud_config.yml @@ -0,0 +1,66 @@ +#cloud-config +users: + - name: damian + groups: users, admin + sudo: ALL=(ALL) NOPASSWD:ALL + shell: /bin/bash + ssh_authorized_keys: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCbhuxFr7zO5fcvLMP8dt1SQAQ1uEw0rJCeFI7o5JFULA4w1dB9yc9FotnVwxRroXpBHxmH7jTFsuCXjHj5CQFDnDb0Vq6iVrtj4WEWBg4N+juA347pmKPLVnyEofpjIHHFSj4b4U/ozk/xEfekNrAxrjhMYcREXQsMI168MNupCEqrqWAyDygokKTicwEX0YNCX2ig5Obs9dUj/nbaWL9/kWgOejuAzQd9guncC0r6Oc8yce+FHjqFpd6tApCLF1IN0KNBfj2k24WEU9JuovwwZ+mbFvKTeZF0O9aXlvuVlrKIS6yfn6Srh22GQJMEhcDMypO8t3AnsKli6vM6J7iUWJuksLf9fOty2ZfJghMOlUHYVcAaXPn2ESReNjSJfHtNOsvIlXsXMznFnTK2WL0115aF0th9Ivxn+t/9onOj6iQALgIYiRSM9tg7zKu1+vglZmU1CKsdzXGGP5P/UVeQFkxjUsYEjEebInfbIl6I246HpLLQIwkqGm/21Ge5hLAEiKYtasoFyRqcc1pWhwj96TMw096pWGrZg89CO8P0U9INhWfHbogT4c07reZpZuSH745thufYQ0CtgJQOlCTQdyilHyZL3d6yDoITNycqMIklnNPRDB9Po5tdD6qzDg7p//OurYx3d5FkhMby6H8/B/79E0+ASh3so5TRP6hiOw== + +package_update: true +package_upgrade: true + +packages: + - fail2ban + - ufw + - curl + - ca-certificates + - systemd-timesyncd + +ssh_pwauth: false +write_files: + - path: /etc/ssh/sshd_config.d/ssh-hardening.conf + content: | + PermitRootLogin no + PasswordAuthentication no + KbdInteractiveAuthentication no + ChallengeResponseAuthentication no + MaxAuthTries 3 + AllowTcpForwarding no + X11Forwarding no + AllowAgentForwarding no + AuthorizedKeysFile .ssh/authorized_keys + AllowUsers damian + +runcmd: + # Time sync + - systemctl enable systemd-timesyncd + - systemctl start systemd-timesyncd || true + + # Fail2ban + - printf "[sshd]\nenabled = true\nport = ssh\nbanaction = iptables-multiport\nmaxretry = 3\nbantime = 3600\nfindtime = 600\n" > /etc/fail2ban/jail.local + - systemctl enable fail2ban + - systemctl restart fail2ban || true + + # Firewall + - ufw allow 22/tcp # SSH + - ufw allow 80/tcp # HTTP + - ufw allow 443/tcp # HTTPS + - ufw allow 3000/tcp # Dokploy UI + - ufw allow 25/tcp # SMTP + - ufw allow 465/tcp # SMTPS + - ufw allow 587/tcp # Submission + - ufw allow 993/tcp # IMAPS + - ufw --force enable + + # Reload SSH to apply hardening + - systemctl restart sshd || systemctl restart ssh || true + + # Dokploy + - curl -sSL https://dokploy.com/install.sh | sh + + # Add damian to docker group + - usermod -aG docker damian || true + + # Finish + - reboot diff --git a/compose.yml b/compose.yml @@ -1,58 +0,0 @@ ---- -services: - updates: - container_name: updates - image: containrrr/watchtower:latest - volumes: [ /var/run/docker.sock:/var/run/docker.sock ] - command: [ --interval, '3600', --cleanup, --rolling-restart ] - restart: always - web: - container_name: web - image: moncheeta/website:latest - ports: [ 80:80, 443:443 ] - volumes: - - ./caddy:/etc/caddy/Caddyfile:ro - - ./auth.conf:/etc/caddy/auth.conf:ro - - ./web/data/:/data/caddy/ - - ./web/config/:/config/caddy/ - restart: always - mail: - container_name: mail - image: ghcr.io/docker-mailserver/docker-mailserver:latest - hostname: mail.prime8.dev - env_file: ./mail/env - ports: [ 25:25, 143:143, 465:465, 587:587, 993:993 ] - volumes: - - ./mail/data/:/var/mail/ - - ./mail/state/:/var/mail-state/ - - ./mail/logs/:/var/log/mail/ - - ./mail/config/:/tmp/docker-mailserver/ - - ./web/data/certificates/acme-v02.api.letsencrypt.org-directory/mail.prime8.dev/mail.prime8.dev.crt:/etc/certificates/cert.pem - - ./web/data/certificates/acme-v02.api.letsencrypt.org-directory/mail.prime8.dev/mail.prime8.dev.key:/etc/certificates/key.pem - depends_on: [ web ] - restart: always - gitolite: - container_name: gitolite - image: jgiannuzzi/gitolite:latest - env_file: ./git/env - volumes: [ ./git/.ssh/keys/:/etc/ssh/keys/, ./git/:/var/lib/git/ ] - ports: [ 22:22 ] - restart: always - gitweb: - container_name: gitweb - image: moncheeta/gitweb:latest - depends_on: [ gitolite ] - volumes: - - ./git/gitweb.conf:/etc/gitweb.conf:ro - - ./git/theme/:/usr/share/gitweb/theme/:ro - - ./git/:/srv/git/:ro - expose: [ 80 ] - restart: always - csc: - container_name: csc - image: moncheeta/csc:latest - environment: [ DOMAIN=csc.prime8.dev ] - env_file: ./csc/env - volumes: [ ./csc/auth.json:/app/google_auth.json:ro ] - expose: [ 80 ] - restart: always diff --git a/csc/.gitignore b/csc/.gitignore @@ -1,2 +0,0 @@ -/env -/auth.json diff --git a/download.sh b/download.sh @@ -1,16 +0,0 @@ -#!/bin/sh - -echo "updating system" -apt update -y && apt upgrade -y - -echo "adding user p8d" -useradd -m -s /bin/bash -G sudo,docker p8d -passwd p8d - -echo "cloning repo" -git clone --recursive https://github.com/moncheeta/p8d.git /p8d/ -chown -R p8d /p8d/ - -cd /p8d/ -echo "now run the setup.sh script to setup services" -su p8d diff --git a/git/.gitignore b/git/.gitignore @@ -1,4 +0,0 @@ -/.gitolite/ -/.ssh/ -/repositories/ -/projects.list diff --git a/git/.gitolite.rc b/git/.gitolite.rc @@ -1,201 +0,0 @@ -# configuration variables for gitolite - -# This file is in perl syntax. But you do NOT need to know perl to edit it -- -# just mind the commas, use single quotes unless you know what you're doing, -# and make sure the brackets and braces stay matched up! - -# (Tip: perl allows a comma after the last item in a list also!) - -# HELP for commands can be had by running the command with "-h". - -# HELP for all the other FEATURES can be found in the documentation (look for -# "list of non-core programs shipped with gitolite" in the master index) or -# directly in the corresponding source file. - -%RC = ( - # ------------------------------------------------------------------ - - # default umask gives you perms of '0700'; see the rc file docs for - # how/why you might change this - UMASK => 0077, - - # look for "git-config" in the documentation - GIT_CONFIG_KEYS => 'gitweb\..*', - - # comment out if you don't need all the extra detail in the logfile - LOG_EXTRA => 1, - # logging options - # 1. leave this section as is for 'normal' gitolite logging (default) - # 2. uncomment this line to log ONLY to syslog: - # LOG_DEST => 'syslog', - # 3. uncomment this line to log to syslog and the normal gitolite log: - # LOG_DEST => 'syslog,normal', - # 4. prefixing "repo-log," to any of the above will **also** log just the - # update records to "gl-log" in the bare repo directory: - # LOG_DEST => 'repo-log,normal', - # LOG_DEST => 'repo-log,syslog', - # LOG_DEST => 'repo-log,syslog,normal', - # syslog 'facility': defaults to 'local0', uncomment if needed. For example: - # LOG_FACILITY => 'local4', - - # roles. add more roles (like MANAGER, TESTER, ...) here. - # WARNING: if you make changes to this hash, you MUST run 'gitolite - # compile' afterward, and possibly also 'gitolite trigger POST_COMPILE' - ROLES => { - READERS => 1, - WRITERS => 1, - }, - - # enable caching (currently only Redis). PLEASE RTFM BEFORE USING!!! - # CACHE => 'Redis', - - # ------------------------------------------------------------------ - - # rc variables used by various features - - # the 'info' command prints this as additional info, if it is set - # SITE_INFO => 'Please see http://blahblah/gitolite for more help', - - # the CpuTime feature uses these - # display user, system, and elapsed times to user after each git operation - # DISPLAY_CPU_TIME => 1, - # display a warning if total CPU times (u, s, cu, cs) crosses this limit - # CPU_TIME_WARN_LIMIT => 0.1, - - # the Mirroring feature needs this - # HOSTNAME => "foo", - - # TTL for redis cache; PLEASE SEE DOCUMENTATION BEFORE UNCOMMENTING! - # CACHE_TTL => 600, - - # ------------------------------------------------------------------ - - # suggested locations for site-local gitolite code (see cust.html) - - # this one is managed directly on the server - # LOCAL_CODE => "$ENV{HOME}/local", - - # or you can use this, which lets you put everything in a subdirectory - # called "local" in your gitolite-admin repo. For a SECURITY WARNING - # on this, see http://gitolite.com/gitolite/non-core.html#pushcode - # LOCAL_CODE => "$rc{GL_ADMIN_BASE}/local", - - # ------------------------------------------------------------------ - - # List of commands and features to enable - - ENABLE => [ - - # COMMANDS - - # These are the commands enabled by default - 'help', - 'desc', - 'info', - # 'perms', - # 'writable', - - # Uncomment or add new commands here. - # 'create', - # 'fork', - # 'mirror', - # 'readme', - # 'sskm', - # 'D', - - # These FEATURES are enabled by default. - - # essential (unless you're using smart-http mode) - 'ssh-authkeys', - - # creates git-config entries from gitolite.conf file entries like 'config foo.bar = baz' - 'git-config', - - # creates git-daemon-export-ok files; if you don't use git-daemon, comment this out - 'daemon', - - # creates projects.list file; if you don't use gitweb, comment this out - 'gitweb', - - # These FEATURES are disabled by default; uncomment to enable. If you - # need to add new ones, ask on the mailing list :-) - - # user-visible behaviour - - # prevent wild repos auto-create on fetch/clone - # 'no-create-on-read', - # no auto-create at all (don't forget to enable the 'create' command!) - # 'no-auto-create', - - # access a repo by another (possibly legacy) name - # 'Alias', - - # give some users direct shell access. See documentation in - # sts.html for details on the following two choices. - # "Shell $ENV{HOME}/.gitolite.shell-users", - # 'Shell alice bob', - - # set default roles from lines like 'option default.roles-1 = ...', etc. - # 'set-default-roles', - - # show more detailed messages on deny - # 'expand-deny-messages', - - # show a message of the day - # 'Motd', - - # system admin stuff - - # enable mirroring (don't forget to set the HOSTNAME too!) - # 'Mirroring', - - # allow people to submit pub files with more than one key in them - # 'ssh-authkeys-split', - - # selective read control hack - # 'partial-copy', - - # manage local, gitolite-controlled, copies of read-only upstream repos - # 'upstream', - - # updates 'description' file instead of 'gitweb.description' config item - 'cgit', - - # allow repo-specific hooks to be added - # 'repo-specific-hooks', - - # performance, logging, monitoring... - - # be nice - # 'renice 10', - - # log CPU times (user, system, cumulative user, cumulative system) - # 'CpuTime', - - # syntactic_sugar for gitolite.conf and included files - - # allow backslash-escaped continuation lines in gitolite.conf - # 'continuation-lines', - - # create implicit user groups from directory names in keydir/ - # 'keysubdirs-as-groups', - - # allow simple line-oriented macros - # 'macros', - - # Kindergarten mode - - # disallow various things that sensible people shouldn't be doing anyway - # 'Kindergarten', - ], - -); - -# ------------------------------------------------------------------------------ -# per perl rules, this should be the last line in such a file: -1; - -# Local variables: -# mode: perl -# End: -# vim: set syn=perl: diff --git a/git/Dockerfile b/git/Dockerfile @@ -1,4 +0,0 @@ -FROM rockstorm/gitweb - -RUN apk --no-cache --update add \ - highlight diff --git a/git/env b/git/env @@ -1,2 +0,0 @@ -SSH_KEY_NAME="moncheeta" -SSH_KEY="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCbhuxFr7zO5fcvLMP8dt1SQAQ1uEw0rJCeFI7o5JFULA4w1dB9yc9FotnVwxRroXpBHxmH7jTFsuCXjHj5CQFDnDb0Vq6iVrtj4WEWBg4N+juA347pmKPLVnyEofpjIHHFSj4b4U/ozk/xEfekNrAxrjhMYcREXQsMI168MNupCEqrqWAyDygokKTicwEX0YNCX2ig5Obs9dUj/nbaWL9/kWgOejuAzQd9guncC0r6Oc8yce+FHjqFpd6tApCLF1IN0KNBfj2k24WEU9JuovwwZ+mbFvKTeZF0O9aXlvuVlrKIS6yfn6Srh22GQJMEhcDMypO8t3AnsKli6vM6J7iUWJuksLf9fOty2ZfJghMOlUHYVcAaXPn2ESReNjSJfHtNOsvIlXsXMznFnTK2WL0115aF0th9Ivxn+t/9onOj6iQALgIYiRSM9tg7zKu1+vglZmU1CKsdzXGGP5P/UVeQFkxjUsYEjEebInfbIl6I246HpLLQIwkqGm/21Ge5hLAEiKYtasoFyRqcc1pWhwj96TMw096pWGrZg89CO8P0U9INhWfHbogT4c07reZpZuSH745thufYQ0CtgJQOlCTQdyilHyZL3d6yDoITNycqMIklnNPRDB9Po5tdD6qzDg7p//OurYx3d5FkhMby6H8/B/79E0+ASh3so5TRP6hiOw== damian@prime8.dev" diff --git a/git/gitweb.conf b/git/gitweb.conf @@ -1,10 +0,0 @@ -our $site_name = "prime8.dev >> repos"; - -our $projectroot = "/srv/git/repositories/"; -our $projects_list = "/srv/git/projects.list"; - -$feature{"highlight"}{"default"} = [1]; - -our $favicon = "theme/git-favicon.png"; -our $logo = "theme/git-logo.png"; -our @stylesheets = "theme/gitweb.css"; diff --git a/git/theme b/git/theme @@ -1 +0,0 @@ -Subproject commit 200eada21e260160a5ff8e6acd01f22073fd1af6 diff --git a/mail/.gitignore b/mail/.gitignore @@ -1,4 +0,0 @@ -/data/ -/state/ -/logs/ -/config/ diff --git a/mail/env b/mail/env @@ -1,58 +0,0 @@ -# Set the log level for DMS. -# This is mostly relevant for container startup scripts and change detection event feedback. -# -# Valid values (in order of increasing verbosity) are: `error`, `warn`, `info`, `debug` and `trace`. -# The default log level is `info`. -LOG_LEVEL=info - -# Check for updates on container start and then once a day -# If an update is available, a mail is sent to POSTMASTER_ADDRESS -# 0 => Update check disabled -# 1 => Update check enabled -ENABLE_UPDATE_CHECK=0 - -# empty => SSL disabled -# letsencrypt => Enables Let's Encrypt certificates -# custom => Enables custom certificates -# manual => Let's you manually specify locations of your SSL certificates for non-standard cases -# self-signed => Enables self-signed certificates -SSL_TYPE=manual - -# These are only supported with `SSL_TYPE=manual`. -# Provide the path to your cert and key files that you've mounted access to within the container. -SSL_CERT_PATH=/etc/certificates/cert.pem -SSL_KEY_PATH=/etc/certificates/key.pem -# Optional: A 2nd certificate can be supported as fallback (dual cert support), eg ECDSA with an RSA fallback. -# Useful for additional compatibility with older MTA and MUA (eg pre-2015). -SSL_ALT_CERT_PATH= -SSL_ALT_KEY_PATH= - -# If you enable Fail2Ban, don't forget to add the following lines to your `compose.yaml`: -# cap_add: -# - NET_ADMIN -# Otherwise, `nftables` won't be able to ban IPs. -ENABLE_FAIL2BAN=1 - -# Fail2Ban blocktype -# drop => drop packet (send NO reply) -# reject => reject packet (send ICMP unreachable) -FAIL2BAN_BLOCKTYPE=drop - -ENABLE_SPAMASSASSIN=1 - -# KAM is a 3rd party SpamAssassin ruleset, provided by the McGrail Foundation. -# If SpamAssassin is enabled, KAM can be used in addition to the default ruleset. -# - **0** => KAM disabled -# - 1 => KAM enabled -# -# Note: only has an effect if `ENABLE_SPAMASSASSIN=1` -ENABLE_SPAMASSASSIN_KAM=1 - -# deliver spam messages to the inbox (tagged using SPAM_SUBJECT) -SPAMASSASSIN_SPAM_TO_INBOX=1 - -# spam messages will be moved in the Junk folder (SPAMASSASSIN_SPAM_TO_INBOX=1 required) -MOVE_SPAM_TO_JUNK=1 - -# spam messages will be marked as read -MARK_SPAM_AS_READ=1 diff --git a/setup.sh b/setup.sh @@ -1,36 +0,0 @@ -#!/bin/sh - -echo "setting up services" -sudo mkdir -p /var/log/mail/ -sudo touch /var/log/mail/mail.log -printf "GROUP_ID=6454678062\nSCHOOLOGY_DOMAIN=schoology.d214.org\nSCHOOLOGY_API_KEY=\nSCHOOLOGY_API_SECRET=\n" > ./csc/env -vim ./csc/env -docker compose up -d -docker compose exec -it mail setup email add damian@prime8.dev -docker compose restart mail -docker compose exec -it mail setup alias add postmaster@prime8.dev damian@prime8.dev -docker compose exec -it mail setup config dkim -docker exec -it mail cat /tmp/docker-mailserver/opendkim/keys/prime8.dev/mail.txt -docker compose down -echo "services are set up" - -echo "setting up firewall" -sudo ufw default deny incoming -sudo ufw default allow outgoing -sudo ufw allow 2222,22,80,443,25,143,465,587,993/tcp -sudo ufw enable -echo "firewall set up" - -echo "copy your ssh public key to server" -echo "press enter to continue" -read KEY - -echo "securing ssh" -PORT=2222 -sudo sed -i -e "s/^#\?PasswordAuthentication .*/PasswordAuthentication no/" \ - -e "s/^#\?PermitRootLogin .*/PermitRootLogin no/" \ - -e "s/^#\?UsePAM .*/UsePAM no/" \ - -e "s/^#\?Port .*/Port $PORT/" \ - /etc/ssh/sshd_config -echo "switched port to $PORT" -sudo systemctl restart ssh diff --git a/web/.gitignore b/web/.gitignore diff --git a/web/config.toml b/web/config.toml diff --git a/web/static/css/bootstrap-responsive.css b/web/static/css/bootstrap-responsive.css diff --git a/web/static/css/bootstrap.css b/web/static/css/bootstrap.css diff --git a/web/static/css/fonts/Fixedsys500c.eot b/web/static/css/fonts/Fixedsys500c.eot Binary files differ. diff --git a/web/static/css/fonts/Fixedsys500c.otf b/web/static/css/fonts/Fixedsys500c.otf Binary files differ. diff --git a/web/static/css/fonts/Fixedsys500c.svg b/web/static/css/fonts/Fixedsys500c.svg diff --git a/web/static/css/fonts/Fixedsys500c.ttf b/web/static/css/fonts/Fixedsys500c.ttf Binary files differ. diff --git a/web/static/css/fonts/Fixedsys500c.woff b/web/static/css/fonts/Fixedsys500c.woff Binary files differ. diff --git a/web/static/css/fonts/Px437_IBM_EGA8.otf b/web/static/css/fonts/Px437_IBM_EGA8.otf Binary files differ. diff --git a/web/static/img/moncheeta.png b/web/static/img/moncheeta.png Binary files differ. diff --git a/web/static/js/bootstrap.js b/web/static/js/bootstrap.js diff --git a/web/static/js/wakatime.js b/web/static/js/wakatime.js diff --git a/web/templates/404.html b/web/templates/404.html diff --git a/web/templates/429.html b/web/templates/429.html diff --git a/web/templates/500.html b/web/templates/500.html diff --git a/web/templates/base.html b/web/templates/base.html diff --git a/web/templates/error.html b/web/templates/error.html diff --git a/web/templates/index.html b/web/templates/index.html diff --git a/web/templates/nav.html b/web/templates/nav.html diff --git a/web/templates/projects.html b/web/templates/projects.html