# Website Creator Skill - Improvements from PDPA Implementation

**Date:** March 9, 2026  
**Source:** Real-world implementation at moreminimore-redesign  
**Status:** ✅ Lessons Learned & Action Items

---

## 🚨 Critical Fixes Required

### 1. Dockerfile Template - Production Server

**PROBLEM:** Original template used `astro preview` (development server)

```dockerfile
# ❌ WRONG - Development server only
CMD ["npx", "astro", "preview", "--host", "0.0.0.0", "--port", "80"]
```

**SOLUTION:** Use Node adapter production server

```dockerfile
# ✅ CORRECT - Production server
CMD ["node", "dist/server/entry.mjs"]
```

**WHY:** 
- `astro preview` is for development only
- Has host restrictions and security limitations
- Not optimized for production
- `node dist/server/entry.mjs` is the actual production server

---

### 2. Dockerfile - Environment Variables for Docker Networking

**PROBLEM:** Server listens on `localhost` by default, not accessible from outside container

```dockerfile
# ❌ MISSING - Server only accessible inside container
ENV NODE_ENV=production
```

**SOLUTION:** Add HOST and PORT environment variables

```dockerfile
# ✅ CORRECT - Server accessible from outside
ENV NODE_ENV=production
ENV HOST=0.0.0.0
ENV PORT=80
```

**WHY:**
- Node.js servers respect `HOST` and `PORT` env vars
- `0.0.0.0` means "listen on all network interfaces"
- Required for Docker container networking
- More reliable than adapter config

---

### 3. Astro DB Build - Remote Flag Required

**PROBLEM:** Build fails without `--remote` flag and `ASTRO_DB_REMOTE_URL`

```dockerfile
# ❌ WRONG - Build fails
RUN npm run build
```

**SOLUTION:** Set env var and use `--remote` flag

```dockerfile
# ✅ CORRECT - Astro DB initialized properly
RUN mkdir -p ./data && ASTRO_DB_REMOTE_URL=file:./data/consent.db npx astro build --remote
```

**WHY:**
- Astro DB requires explicit connection info at build time
- `--remote` flag tells Astro to connect to database
- `ASTRO_DB_REMOTE_URL` must be set during build
- Data directory must exist before build

---

### 4. Package Installation - Production Dependencies

**PROBLEM:** `npm ci --production` skips build-time dependencies

```dockerfile
# ❌ WRONG - Missing @astrojs/node at build time
RUN npm ci --production
```

**SOLUTION:** Use `npm install --production`

```dockerfile
# ✅ CORRECT - All dependencies available
RUN npm install --production
```

**WHY:**
- `npm ci --production` is too strict
- Some packages needed at both build and runtime
- `npm install --production` handles this correctly

---

## 📝 Skill Template Updates Needed

### Updated Dockerfile Template

```dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
# Create data directory BEFORE build (Astro DB requirement)
RUN mkdir -p ./data && ASTRO_DB_REMOTE_URL=file:./data/consent.db npx astro build --remote

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
# Use npm install, not npm ci --production
RUN npm install --production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/db ./db
COPY --from=builder /app/data ./data

# SQLite runtime for Astro DB
RUN apk add --no-cache sqlite-libs

EXPOSE 80

# Critical environment variables for Docker networking
ENV NODE_ENV=production
ENV ASTRO_DB_REMOTE_URL=file:/app/data/consent.db
ENV HOST=0.0.0.0
ENV PORT=80
ENV ADMIN_PASSWORD=${ADMIN_PASSWORD}

# Use production server, NOT astro preview
CMD ["node", "dist/server/entry.mjs"]
```

---

### Updated astro.config.mjs Template

```javascript
// @ts-check
import { defineConfig } from 'astro/config';
import db from '@astrojs/db';
import node from '@astrojs/node';

import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  integrations: [db()],
  adapter: node({
    mode: 'standalone'
    // Don't set host/port here - use environment variables instead
  }),
  vite: {
    plugins: [tailwindcss()],
    server: {
      host: true  // Allow all hosts in development
    }
  }
});
```

---

### Updated package.json Template

```json
{
  "dependencies": {
    "astro": "^5.x.x",
    "@astrojs/db": "^0.19.0",
    "@astrojs/node": "^9.x.x",
    "@libsql/client": "^0.17.0",
    "drizzle-orm": "^0.45.1",
    "astro-consent": "^1.0.17",
    "@tailwindcss/vite": "^4.x.x",
    "tailwindcss": "^4.x.x"
  },
  "scripts": {
    "dev": "astro dev",
    "build": "astro build",
    "preview": "astro preview",
    "start": "node dist/server/entry.mjs"
  }
}
```

---

## 🔧 Workflow Improvements

### 1. Pre-Flight Checklist (MUST ask before starting)

```markdown
## Critical Questions:

1. **Deployment Platform:**
   - Easypanel? (requires HOST=0.0.0.0)
   - Vercel/Netlify? (different adapter needed)
   - Docker only? (full Dockerfile)

2. **Database Requirements:**
   - Consent logging needed? (Astro DB)
   - Just static site? (no DB needed)
   - External DB? (Turso, PlanetScale, etc.)

3. **Analytics:**
   - Umami instance available? (get credentials)
   - Use Umami Cloud? (API key needed)
   - No analytics? (skip integration)

4. **Admin Dashboard:**
   - Need consent logs viewer? (create /admin routes)
   - Default password? (MUST change in production)
```

---

### 2. Build Process (MUST test before deploy)

```markdown
## Testing Steps (MANDATORY BEFORE DEPLOY):

1. **Test Build Locally:**
   ```bash
   rm -rf dist data
   mkdir -p data
   ASTRO_DB_REMOTE_URL=file:./data/consent.db npx astro build --remote
   ```

2. **Test Server Locally:**
   ```bash
   HOST=0.0.0.0 PORT=4321 node dist/server/entry.mjs &
   curl http://localhost:4321
   pkill -f entry.mjs
   ```

3. **Verify:**
   - ✅ Build completes without errors
   - ✅ Server starts successfully
   - ✅ Homepage loads
   - ✅ API routes respond
   - ✅ Database initialized
   ```

---

### 3. Umami Integration (Automatic)

```markdown
## Automated Workflow:

1. **Check for Umami credentials:**
   ```bash
   # Check global ~/.config/opencode/.env
   cat ~/.config/opencode/.env | grep UMAMI
   ```

2. **If credentials exist:**
   ```bash
   # Auto-create website
   python3 skills/umami/scripts/umami_client.py \
     --action create-website \
     --website-name "{site-name}" \
     --website-domain "{domain}"
   ```

3. **Update configuration automatically:**
   - `.env` file with UMAMI_WEBSITE_ID
   - `Layout.astro` with actual tracking script
   - No placeholder values
   ```

---

### 4. Error Handling & Troubleshooting

```markdown
## Common Errors & Solutions:

### "Cannot find module '@astrojs/node'"
- **Cause:** Missing from production dependencies
- **Fix:** Add to package.json dependencies (not devDependencies)

### "Attempting to build without the --remote flag"
- **Cause:** Astro DB needs explicit connection
- **Fix:** Add `ASTRO_DB_REMOTE_URL=file:./data/consent.db` and `--remote` flag

### "Unable to open connection to local database"
- **Cause:** Data directory doesn't exist
- **Fix:** Run `mkdir -p ./data` before build

### "Blocked request. This host is not allowed"
- **Cause:** Server listening on localhost only
- **Fix:** Add `ENV HOST=0.0.0.0` to Dockerfile

### "Server listening on http://localhost:80" (in container)
- **Cause:** Wrong HOST environment
- **Fix:** Use `ENV HOST=0.0.0.0` not adapter config
```

---

## 📚 New Documentation Templates

### PDPA-COMPLIANCE.md (Auto-generated)

```markdown
# PDPA Compliance Checklist

## Privacy Policy Requirements (Section 36)
- [ ] Data Controller Information
- [ ] Types of Data Collected
- [ ] Purpose of Data Processing
- [ ] Legal Basis for Processing
- [ ] Data Retention Period
- [ ] Data Sharing & Disclosure
- [ ] Cross-border Transfers
- [ ] Automated Decision Making
- [ ] Cookies & Tracking Technologies
- [ ] Data Subject Rights (8 rights)
- [ ] Data Security Measures
- [ ] DPO Contact
- [ ] Right to Lodge Complaint
- [ ] Policy Version & Last Updated

## Cookie Consent Requirements
- [ ] Opt-in model (not pre-ticked)
- [ ] Granular choices
- [ ] Equal prominence for Accept/Reject
- [ ] Withdrawal mechanism
- [ ] Script blocking until consent
- [ ] Consent logging (10+ years)

## Admin Dashboard
- URL: `/admin/consent-logs`
- Default Password: `{password}` (⚠️ CHANGE THIS!)
- Features: View logs, delete records, export CSV
```

---

## 🎯 Skill Enhancement Priority

### HIGH PRIORITY (Fix Immediately)

1. ✅ **Update Dockerfile template** - Production server + env vars
2. ✅ **Add build testing step** - Test locally before deploy
3. ✅ **Umami auto-integration** - Use credentials from global .env
4. ✅ **Add Astro DB requirements** - --remote flag, mkdir data

### MEDIUM PRIORITY (Next Sprint)

1. ⏳ **Error detection** - Auto-detect common errors and suggest fixes
2. ⏳ **Deployment verification** - Automated post-deploy testing
3. ⏳ **Environment variable validation** - Check all required vars before build
4. ⏳ **Rollback procedure** - Document and automate rollback

### LOW PRIORITY (Future Enhancement)

1. 📋 **Multi-platform support** - Vercel, Netlify, Cloudflare adapters
2. 📋 **Database migration** - Auto-migrate Astro DB schema changes
3. 📋 **Performance monitoring** - Built-in uptime and error tracking
4. 📋 **SEO automation** - Auto-generate sitemap, robots.txt, meta tags

---

## 📖 Learning Resources

### Internal Documentation
- `/skills/website-creator/KNOWN-ISSUES.md` - Common problems & solutions
- `/skills/website-creator/DEPLOYMENT-GUIDE.md` - Platform-specific guides
- `/skills/website-creator/TESTING-CHECKLIST.md` - Pre-deploy testing

### External References
- [Astro DB Production Guide](https://docs.astro.build/en/guides/astro-db/#production)
- [Node Adapter Docs](https://docs.astro.build/en/guides/integrations-guide/node/)
- [Docker Networking](https://docs.docker.com/network/)
- [PDPA Guidelines](https://www.pdpc.or.th/)

---

## ✅ Implementation Status

| Improvement | Status | Priority |
|-------------|--------|----------|
| Dockerfile production server | ✅ Ready | HIGH |
| HOST=0.0.0.0 environment variable | ✅ Ready | HIGH |
| Astro DB --remote flag | ✅ Ready | HIGH |
| npm install vs npm ci | ✅ Ready | HIGH |
| Local build testing | ✅ Ready | HIGH |
| Umami auto-integration | ✅ Ready | HIGH |
| Error detection | 📝 Planned | MEDIUM |
| Deployment verification | 📝 Planned | MEDIUM |

---

**Last Updated:** March 9, 2026  
**Based On:** moreminimore-redesign PDPA implementation  
**Next Review:** After next 3 deployments
