Portfolio website built with Astro, deployed as Docker container behind Nginx reverse proxy.
Domains:
- Primary:
konxc.space - WWW:
www.konxc.space
Tech Stack:
- Framework: Astro 5.x
- Runtime: Node.js 20
- Adapter: @astrojs/node (standalone)
- Container: Docker
- Reverse Proxy: Nginx
- SSL: Let's Encrypt
cd /home/dev/web
./scripts/generate-ssl-konxc.shThis will:
- Request SSL certificate from Let's Encrypt
- Configure for both
konxc.spaceandwww.konxc.space - Enable auto-renewal
cd /home/dev/web
./scripts/deploy-konxc-portfolio.shThis will:
- Build Docker image
- Start container
- Configure nginx
- Verify deployment
/home/dev/web/
βββ instances/koneksi/services/portfolio/
β βββ Dockerfile # Docker build config
β βββ docker-compose.yml # Container orchestration
β βββ .dockerignore # Build exclusions
β βββ package.json # Dependencies
β βββ astro.config.mjs # Astro configuration
β βββ src/ # Source code
βββ infrastructure/nginx/conf.d/
β βββ konxc.space.conf # Nginx configuration
βββ scripts/
βββ deploy-konxc-portfolio.sh # Deployment script
βββ generate-ssl-konxc.sh # SSL setup script
Name: koneksi-portfolio
Port: 4321 (internal only)
Network: nginx-net
Health Check: HTTP GET on port 4321
HTTP (Port 80):
- Redirects to HTTPS
- Handles ACME challenges for SSL renewal
HTTPS (Port 443):
- Serves both
konxc.spaceandwww.konxc.space - Proxies to
koneksi-portfolio:4321 - Security headers enabled
- Static asset caching (1 year)
NODE_ENV=production
HOST=0.0.0.0
PORT=4321cd /home/dev/web/instances/koneksi/services/portfolio
docker build -t konxc-portfolio:latest .docker compose up -ddocker compose downdocker logs -f koneksi-portfoliodocker compose restartdocker compose down
docker build -t konxc-portfolio:latest .
docker compose up -dcurl -I http://konxc.space
# Should return 301 redirect to https://curl -I https://konxc.space
# Should return 200 OKcurl -I https://www.konxc.space
# Should return 200 OKdocker inspect koneksi-portfolio --format='{{.State.Health.Status}}'
# Should return: healthydocker exec nginx-proxy nginx -tsudo certbot certificates -d konxc.spacesudo certbot renew --cert-name konxc.space
docker exec nginx-proxy nginx -s reloadCertbot automatically renews certificates via systemd timer:
# Check timer status
systemctl status certbot.timer
# Test renewal (dry-run)
sudo certbot renew --dry-rundocker ps --filter "name=koneksi-portfolio"docker stats koneksi-portfolio --no-stream# Access logs
docker exec nginx-proxy tail -f /var/log/nginx/konxc.space.access.log
# Error logs
docker exec nginx-proxy tail -f /var/log/nginx/konxc.space.error.log# Real-time
docker logs -f koneksi-portfolio
# Last 100 lines
docker logs --tail 100 koneksi-portfolio# Check logs
docker logs koneksi-portfolio
# Check if port is available
docker ps | grep 4321
# Rebuild image
docker compose down
docker build --no-cache -t konxc-portfolio:latest .
docker compose up -d# Check certificate files
sudo ls -la /etc/letsencrypt/live/konxc.space/
# Regenerate certificate
./scripts/generate-ssl-konxc.sh# Test nginx config
docker exec nginx-proxy nginx -t
# Reload nginx
docker exec nginx-proxy nginx -s reload
# Check nginx logs
docker logs nginx-proxy# Check container is running
docker ps | grep koneksi-portfolio
# Check container health
docker inspect koneksi-portfolio --format='{{.State.Health.Status}}'
# Check nginx is running
docker ps | grep nginx-proxy
# Test from inside container
docker exec koneksi-portfolio wget -O- http://localhost:4321cd /home/dev/web/instances/koneksi/services/portfolio
# Pull latest changes
git pull
# Rebuild and deploy
./scripts/deploy-konxc-portfolio.shcd /home/dev/web/instances/koneksi/services/portfolio
# Update dependencies
pnpm update
# Test locally
pnpm run build
pnpm run preview
# Deploy
./scripts/deploy-konxc-portfolio.sh# Edit nginx config
nano /home/dev/web/infrastructure/nginx/conf.d/konxc.space.conf
# Test config
docker exec nginx-proxy nginx -t
# Reload nginx
docker exec nginx-proxy nginx -s reload- Container runs as standalone Node.js server (not static)
- Astro SSR enabled with Node adapter
- Health checks ensure container is responding
- Static assets cached for 1 year
- Security headers enabled
- HTTP/2 enabled
- HSTS enabled with 1 year max-age
For issues or questions:
- Check container logs:
docker logs koneksi-portfolio - Check nginx logs:
docker exec nginx-proxy tail -f /var/log/nginx/konxc.space.error.log - Verify DNS:
dig konxc.spaceanddig www.konxc.space - Test SSL:
openssl s_client -connect konxc.space:443 -servername konxc.space