Add README with site overview, deployment, and troubleshooting notes.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
fdae8a727b
commit
e0a1702571
255
README.md
Normal file
255
README.md
Normal file
@ -0,0 +1,255 @@
|
||||
# Caseware — Ilia Dobkin portfolio site
|
||||
|
||||
Static one-page site for CaseWare / CaseView consulting work. No build step — plain HTML and CSS.
|
||||
|
||||
| File | Purpose |
|
||||
|-------------|----------------------------------|
|
||||
| `index.html`| Page content and structure |
|
||||
| `styles.css`| Layout, typography, theme |
|
||||
|
||||
**Live site:** https://caseware.levkin.ca
|
||||
**Booking:** https://cal.levkin.ca/ilia/consult
|
||||
|
||||
---
|
||||
|
||||
## Local development
|
||||
|
||||
```bash
|
||||
cd caseware
|
||||
python3 -m http.server 8765
|
||||
# Open http://localhost:8765
|
||||
```
|
||||
|
||||
Or open `index.html` directly in a browser (some features work best over HTTP).
|
||||
|
||||
---
|
||||
|
||||
## Git repository
|
||||
|
||||
| Item | Value |
|
||||
|---------|--------|
|
||||
| Remote | `gitea@10.0.30.169:ilia/caseware.git` |
|
||||
| Branch | `main` |
|
||||
|
||||
### Push changes (from your Mac)
|
||||
|
||||
```bash
|
||||
cd /path/to/caseware
|
||||
git add -A
|
||||
git commit -m "Describe your change"
|
||||
git push
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Production deployment
|
||||
|
||||
Traffic flow:
|
||||
|
||||
```
|
||||
Internet → Caddy (caseware.levkin.ca) → LXC 215 (nginx :80) → /var/www/caseware
|
||||
```
|
||||
|
||||
| Component | Details |
|
||||
|-----------|---------|
|
||||
| Proxmox host | `PVENAS` |
|
||||
| Container ID | `215` |
|
||||
| Hostname | `caseware` |
|
||||
| IP | `10.0.10.105` (DHCP on `vmbr0`) |
|
||||
| Gateway | `10.0.10.1` |
|
||||
| Web root | `/var/www/caseware` |
|
||||
| Web server | nginx |
|
||||
|
||||
### Caddy (on separate server)
|
||||
|
||||
```caddy
|
||||
caseware.levkin.ca {
|
||||
reverse_proxy 10.0.10.105:80
|
||||
}
|
||||
```
|
||||
|
||||
Reload after edits: `systemctl reload caddy`
|
||||
|
||||
### Create LXC 215 (reference — already done)
|
||||
|
||||
```bash
|
||||
pct create 215 local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst \
|
||||
--hostname caseware \
|
||||
--memory 512 \
|
||||
--swap 256 \
|
||||
--cores 1 \
|
||||
--rootfs local-lvm:4 \
|
||||
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
|
||||
--unprivileged 1 \
|
||||
--onboot 1 \
|
||||
--start 1
|
||||
|
||||
pct exec 215 -- hostname -I # note the IP (10.0.10.105)
|
||||
```
|
||||
|
||||
### Shell access to the container
|
||||
|
||||
No default root password. From Proxmox:
|
||||
|
||||
```bash
|
||||
pct enter 215
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## First-time setup inside CT 215
|
||||
|
||||
```bash
|
||||
apt update && apt install -y git nginx openssh-client
|
||||
|
||||
# SSH key for Gitea (add public key in Gitea → Settings → SSH Keys)
|
||||
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
|
||||
cat /root/.ssh/id_ed25519.pub
|
||||
ssh -o StrictHostKeyChecking=accept-new -T gitea@10.0.30.169
|
||||
|
||||
mkdir -p /var/www/caseware
|
||||
git clone gitea@10.0.30.169:ilia/caseware.git /var/www/caseware
|
||||
chown -R root:root /var/www/caseware
|
||||
chmod 755 /var/www/caseware
|
||||
chmod 644 /var/www/caseware/index.html /var/www/caseware/styles.css
|
||||
```
|
||||
|
||||
### nginx site config
|
||||
|
||||
```bash
|
||||
cat > /etc/nginx/sites-available/caseware <<'EOF'
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
server_name _;
|
||||
root /var/www/caseware;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ =404;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
ln -sf /etc/nginx/sites-available/caseware /etc/nginx/sites-enabled/caseware
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
nginx -t && systemctl enable --now nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deploy updates (pull on server)
|
||||
|
||||
From Proxmox:
|
||||
|
||||
```bash
|
||||
pct exec 215 -- bash -c 'cd /var/www/caseware && git pull'
|
||||
```
|
||||
|
||||
Or inside the container:
|
||||
|
||||
```bash
|
||||
pct enter 215
|
||||
cd /var/www/caseware && git pull
|
||||
exit
|
||||
```
|
||||
|
||||
Hard-refresh the browser (Cmd+Shift+R) after deploy.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting (issues we hit)
|
||||
|
||||
### 1. `git clone` asks for password / “not a git repository”
|
||||
|
||||
**Cause:** Container had no SSH key registered in Gitea.
|
||||
|
||||
**Fix:**
|
||||
|
||||
1. Generate key inside 215: `ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519`
|
||||
2. Add `cat /root/.ssh/id_ed25519.pub` to Gitea (user `ilia`) → SSH Keys
|
||||
3. Test: `ssh -T gitea@10.0.30.169` — should say “Hi there, ilia!” with no password
|
||||
4. Clone: `git clone gitea@10.0.30.169:ilia/caseware.git /var/www/caseware`
|
||||
|
||||
Do **not** rely on cloning on the Proxmox host unless you prefer that workflow — clone inside 215 with its own key (named e.g. `caseware` in Gitea).
|
||||
|
||||
---
|
||||
|
||||
### 2. `fatal: detected dubious ownership in repository`
|
||||
|
||||
**Cause:** `chown -R www-data:www-data /var/www/caseware` made the repo owned by `www-data` while `git pull` runs as `root`.
|
||||
|
||||
**Fix (recommended):** Repo owned by root; nginx only needs read access:
|
||||
|
||||
```bash
|
||||
chown -R root:root /var/www/caseware
|
||||
chmod 755 /var/www/caseware
|
||||
chmod 644 /var/www/caseware/index.html /var/www/caseware/styles.css
|
||||
```
|
||||
|
||||
**Alternative:** `git config --global --add safe.directory /var/www/caseware`
|
||||
|
||||
---
|
||||
|
||||
### 3. “Welcome to nginx!” instead of the site
|
||||
|
||||
**Cause:** Default site still enabled; root pointed at `/var/www/html`.
|
||||
|
||||
**Fix:** Enable `caseware` site config (see above), remove `sites-enabled/default`, `nginx -t && systemctl reload nginx`.
|
||||
|
||||
Verify: `curl -s http://127.0.0.1/ | head -5` should show `<!doctype html>` and “Ilia Dobkin”.
|
||||
|
||||
---
|
||||
|
||||
### 4. Wrong network assumptions
|
||||
|
||||
Lab LAN uses **`10.0.10.0/24`** (gateway `10.0.10.1` on `vmbr0`), not `10.0.30.x`.
|
||||
Gitea lives at **`10.0.30.169`** — different subnet; routing must allow 215 → Gitea.
|
||||
|
||||
Container IP from DHCP: `pct exec 215 -- hostname -I` → currently **10.0.10.105**.
|
||||
|
||||
---
|
||||
|
||||
### 5. LinkedIn link 404
|
||||
|
||||
These URLs do **not** work:
|
||||
|
||||
- `https://www.linkedin.com/in/idobkin/`
|
||||
- `https://www.linkedin.com/in/iliadobkin/`
|
||||
|
||||
Working profile in site:
|
||||
|
||||
- `https://www.linkedin.com/in/ilia-dobkin-8263343/`
|
||||
|
||||
---
|
||||
|
||||
### 6. No root password on LXC
|
||||
|
||||
Expected. Use `pct enter 215` from Proxmox. Set `passwd root` only if you need SSH from other machines.
|
||||
|
||||
---
|
||||
|
||||
### 7. `curl` not found inside container
|
||||
|
||||
Install optionally: `apt install -y curl`
|
||||
Or test from Proxmox host: `curl -I http://10.0.10.105/`
|
||||
|
||||
---
|
||||
|
||||
## Quick reference
|
||||
|
||||
| Task | Command |
|
||||
|------|---------|
|
||||
| Enter container | `pct enter 215` |
|
||||
| Container IP | `pct exec 215 -- hostname -I` |
|
||||
| Pull latest | `pct exec 215 -- bash -c 'cd /var/www/caseware && git pull'` |
|
||||
| Test site | `curl -I http://10.0.10.105/` |
|
||||
| nginx reload | `pct exec 215 -- systemctl reload nginx` |
|
||||
|
||||
---
|
||||
|
||||
## Optional improvements (not done yet)
|
||||
|
||||
- `og:image` for LinkedIn/Slack link previews
|
||||
- Mobile nav for small screens
|
||||
- DHCP reservation for 215 so `10.0.10.105` stays stable (or set static IP in Proxmox)
|
||||
Loading…
x
Reference in New Issue
Block a user