6.8 KiB
Debbie Windler Seamstress Website
Self-hosted website and owner administration system for debbiewindlerseamstress.com.
This project is intentionally a small, understandable Node.js application with Express, SQLite, session login, local image storage, Docker support, backups, and a nontechnical owner backend. It does not include checkout, customer accounts, public comments, customer uploads, payments, or scheduling.
What Was Built
- Four public pages: Home, Items, Services, About and Contact.
- Full-screen editable hero with replaceable background image, overlay, position, text, and buttons.
- Editable featured/new/sale item showcase.
- Alphabetical item browsing with search and filters.
- Editable services page.
- Editable about text and equipment list.
- Website contact form that stores messages in SQLite even when email notification is not configured or fails.
- Secure first-owner setup flow at
/admin/setup. - Owner login at
/admin. - Admin dashboard, page editor, item manager, service manager, about/equipment manager, messages inbox, media library, appearance settings, navigation settings, business settings, search/sharing settings, security settings, backups, and maintenance mode.
- Local image upload validation and WebP optimization through Sharp.
- Manual downloadable backup archives for the database and uploaded images.
- Docker and Docker Compose support.
- Sample content and one sample sewing-themed hero image that should be replaced with Debbie's real artwork/photos.
Project Location
C:\Users\Owner\Documents\UO private Server\DebbieWindlerSeamstress
Local Development
Install Node.js 24 or newer, then from this folder:
pnpm install
pnpm run init-db
pnpm run dev
Open:
http://localhost:3000
If pnpm is not installed globally, npm install and npm run dev also work.
First Owner Setup
- Start the site.
- Open
http://localhost:3000/admin. - The app will redirect to
/admin/setupuntil the first owner account is created. - Enter owner name, email, and a password with at least 10 characters.
- After setup, future visits to
/adminuse the owner login screen.
No administrator password is hardcoded or stored as plain text.
Common Owner Tasks
Edit the home page:
- Log in at
/admin. - Choose
Home Page. - Change hero text, background URL, overlay, buttons, and showcase text.
- Use
Preview Home Page.
Add an item:
- Choose
Items. - Choose
Add Item. - Fill in name, descriptions, category, price notes, availability, badges, and publish setting.
- Upload one or more item images.
- Save.
Read a customer message:
- Choose
Messages. - Open a message.
- Use
Reply by Emailto open the computer's normal email program. - Mark unread, archive, or delete as needed.
Create a backup:
- Choose
Backups. - Choose
Create Manual Backup. - Download the created ZIP file.
Environment Setup
Copy .env.example to .env for local or production configuration.
Important values:
PORT: app port, default3000.APP_BASE_URL: final public URL, for examplehttps://debbiewindlerseamstress.com.SESSION_SECRET: long random secret for sessions.DATABASE_PATH: SQLite file path.UPLOAD_DIR: uploaded image folder.BACKUP_DIR: backup output folder.OWNER_EMAIL: where contact form notifications go.SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASS,SMTP_FROM: email notification settings.
Messages are always stored in the database even when SMTP is empty or fails.
Docker
Create .env, then run:
docker compose up -d --build
The app stores persistent files in:
./storage./public/uploads
Do not include .env in downloadable backups or source control.
Production Hosting Notes
Recommended production shape:
- Run the app with Docker Compose on Perry's server.
- Put a reverse proxy such as Caddy, Nginx, or IIS ARR in front of it.
- Configure TLS for
debbiewindlerseamstress.com. - Later, redirect
debbiewindler.comtodebbiewindlerseamstress.com. - Set
NODE_ENV=production,APP_BASE_URL,SESSION_SECRET, SMTP values, and owner email in.env.
This project does not make DNS, router, firewall, reverse proxy, or live production changes.
Backup and Restore
Manual backups are created from /admin/backups.
Backups include:
- SQLite database.
- Uploaded images.
Backups exclude:
.env.- passwords and SMTP secrets outside the database.
Restore process:
- Stop the app.
- Make a copy of the current
storageandpublic/uploadsfolders. - Extract the backup ZIP.
- Replace
storage/site.sqliteand restore theuploadsfolder. - Start the app and check
/healthz.
Use strong confirmation before replacing production files.
Testing
Run:
pnpm test
Current smoke tests verify:
- Public pages load.
- Admin redirects to setup/login.
- Contact form validation and CSRF session behavior.
Manual checklist before going live:
- Create owner account.
- Log in and log out.
- Edit the home hero and preview.
- Upload an image and confirm it appears in the media library.
- Add an item and confirm
/itemsstays alphabetical. - Add a service and reorder it.
- Edit About and Equipment entries.
- Submit a contact form message.
- Confirm the message appears in the admin inbox.
- Configure SMTP and confirm email notifications.
- Confirm messages are still stored if SMTP is disabled.
- Create and download a backup.
- Enable maintenance mode and confirm admins can still log in.
- Check phone, tablet, and desktop widths.
Security Checklist
- Set a long
SESSION_SECRET. - Use HTTPS in production.
- Keep
.envprivate. - Use a strong owner password.
- Keep Docker base images and npm packages updated.
- Back up before updates.
- Do not expose
public/uploadsas executable content. - Do not add customer file uploads without a separate security review.
- Keep private home address hidden unless Debbie deliberately chooses to publish it.
Still Needed From Owner
- Final Debbie business wording.
- Final email address and phone number.
- Facebook page link, if desired.
- Service area and business hours.
- Final photos, artwork, logo, favicon, and business card artwork.
- Real service descriptions and pricing notes.
- Real item listings and item photos.
- SMTP provider settings.
- Decision on whether
debbiewindler.comshould redirect at the reverse proxy or DNS/hosting layer later.
Notes About Initial Version
This is a complete working first version, but a few advanced features are intentionally conservative:
- CAPTCHA is wired as a future setting but not enabled by default.
- Revision history is stored for important edits; a polished one-click restore screen can be expanded later.
- The page editor uses controlled section layouts instead of arbitrary code or drag-and-drop.
- The owner reply flow uses
mailto:instead of a built-in outgoing email client.