## CI/CD Improvements
**Database Reset on Every Deployment:**
- CT109 Pre-Production: Automatically deletes database volume before deployment
- Production VPS: Same fresh database logic for consistent deployments
- Creates timestamped backup before deletion for safety
- Ensures 100% fresh state (only admin user, no sample data)
**Security Fix:**
- Moved hardcoded Telegram bot token to Gitea secret
- Now uses ${{ secrets.CT109_TELEGRAM_BOT_TOKEN }} in workflow
- Prevents token exposure in repository
## Documentation Created
**DEPLOYMENT.md (Rewritten):**
- Fixed incorrect deployment path (/opt/littleshop → ~/littleshop for CT109)
- Added comprehensive CI/CD-based deployment guide
- Documented automatic fresh database on every deployment
- Included network architecture diagrams
- Added troubleshooting for common networking issues
- Removed incorrect docker-compose manual instructions
**SILVERPAY_SETUP.md (New):**
- Complete SilverPay integration configuration guide
- Installation instructions for CT109
- API key generation and webhook security
- Payment workflow documentation
- Troubleshooting common integration issues
- Alternative BTCPay Server reference
**BOT_REGISTRATION.md (New):**
- TeleBot first-time setup and registration guide
- Automatic vs manual registration workflows
- Bot token security best practices
- API endpoints for bot management
- Comprehensive troubleshooting section
- Database schema documentation
## Gitea Secrets Required
To complete deployment, add this secret in Gitea repository settings:
**Name:** CT109_TELEGRAM_BOT_TOKEN
**Value:** 8254383681:AAE_j4cUIP9ABVE4Pqrmtgjfmqq1yc4Ow5A
## Breaking Changes
⚠️ **Database will be deleted on every deployment**
- All products, orders, customers, and payments will be reset
- Only admin user and bot registrations preserved
- Backups created automatically before deletion
This is intentional for testing environments - ensures consistent, repeatable deployments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
12 KiB
LittleShop Deployment Guide
This guide covers deploying LittleShop and TeleBot using Gitea Actions CI/CD pipeline.
📋 Overview
LittleShop uses Gitea Actions for automated deployment to:
- CT109 Pre-Production (10.0.0.51) - Automated deployment on push to
mainordevelopment - Production VPS (srv1002428.hstgr.cloud) - Manual deployment only
🚀 Quick Deploy (Recommended - CI/CD)
The easiest and recommended way to deploy is via git push, which automatically triggers the Gitea Actions workflow:
# Make your changes
git add .
git commit -m "Your changes"
# Push to trigger automatic deployment to CT109
git push origin main # or development branch
# Deployment happens automatically:
# 1. Gitea Actions workflow triggers
# 2. SSH connection to CT109
# 3. Code cloned/updated to ~/littleshop
# 4. Docker images built on CT109
# 5. Database volume deleted (fresh start)
# 6. Containers started with fresh database
# 7. Health checks verify deployment
What Happens Automatically
The CI/CD pipeline (.gitea/workflows/build-and-deploy.yml) automatically:
- ✅ Connects to CT109 via SSH
- ✅ Clones/updates code to
~/littleshopdirectory - ✅ Builds Docker images with
--no-cache - ✅ Stops existing containers
- ✅ Deletes database volume for fresh start (backup created first!)
- ✅ Creates networks (
littleshop-network,silverpay-network) - ✅ Starts LittleShop on port 5100:5000
- ✅ Starts TeleBot with proper networking
- ✅ Runs health checks to verify deployment
Fresh Database on Every Deployment
IMPORTANT: Every deployment now automatically:
- Creates timestamped backup of existing database
- Deletes the database volume completely
- Starts with 100% fresh database (only admin user, no products/orders/customers)
This ensures consistent, repeatable testing environments.
🌍 Deployment Environments
CT109 Pre-Production (10.0.0.51)
Deployment Path: ~/littleshop (home directory of deploy user)
Configuration:
- Environment: Development
- Port: 5100:5000 (host:container)
- Database:
littleshop-dev.db(fresh on every deploy) - Networks:
littleshop-network+silverpay-network - Sample Data: Disabled in Production/Development environments
Access Points:
- API: http://10.0.0.51:5100/api
- Admin Panel: http://10.0.0.51:5100/Admin
- Swagger: http://10.0.0.51:5100/swagger
- Health Check: http://10.0.0.51:5100/api/version
Production VPS (srv1002428.hstgr.cloud)
Deployment Path: /opt/littleshop
Configuration:
- Environment: Production
- Port: 5100:5000 (host:container)
- Database:
littleshop-production.db(fresh on every deploy) - Networks:
littleshop_littleshop-network+silverpay_silverpay-network - Deployment: Manual only via
workflow_dispatch
Access Points:
- API: https://admin.dark.side/api
- Admin Panel: https://admin.dark.side/Admin
🔐 Required Gitea Secrets
Configure these secrets in Gitea repository settings under Settings → Secrets:
CT109 Pre-Production Secrets
CT109_HOST = 10.0.0.51
CT109_SSH_PORT = 22
CT109_USER = sysadmin
CT109_SSH_KEY = <SSH private key>
CT109_TELEGRAM_BOT_TOKEN = <Telegram bot token for CT109>
Production VPS Secrets
VPS_HOST = srv1002428.hstgr.cloud
VPS_PORT = 2255
VPS_USER = sysadmin
VPS_SSH_KEY = <SSH private key>
TELEGRAM_BOT_TOKEN = <Telegram bot token for production>
📦 Manual Deployment (Not Recommended)
If you need to deploy manually without CI/CD (for troubleshooting):
1. SSH to CT109
ssh sysadmin@10.0.0.51
cd ~/littleshop
2. Pull Latest Code
git pull origin main
3. Build Docker Images
docker build --no-cache -t littleshop:latest .
docker build --no-cache -t telebot:latest -f Dockerfile.telebot .
4. Stop Existing Containers
docker stop littleshop telebot-service 2>/dev/null || true
docker rm littleshop telebot-service 2>/dev/null || true
5. Reset Database (Fresh Start)
# Backup existing database
docker run --rm -v littleshop-data:/data -v $(pwd):/backup alpine sh -c \
"if [ -f /data/littleshop-dev.db ]; then cp /data/littleshop-dev.db /backup/littleshop-dev.db.backup-$(date +%Y%m%d-%H%M%S); fi"
# Delete database volume
docker volume rm littleshop-data
6. Create Networks
docker network create littleshop-network 2>/dev/null || true
docker network create silverpay-network 2>/dev/null || true
7. Start LittleShop
docker run -d \
--name littleshop \
--restart unless-stopped \
--network littleshop-network \
-p 5100:5000 \
-v littleshop-data:/app/data \
-e ASPNETCORE_URLS=http://+:5000 \
-e ASPNETCORE_ENVIRONMENT=Development \
littleshop:latest
8. Start TeleBot
docker run -d \
--name telebot-service \
--restart unless-stopped \
--network silverpay-network \
-e ASPNETCORE_URLS=http://+:5010 \
-e LittleShop__ApiUrl=http://littleshop:5000 \
-e LittleShop__UseTor=false \
-e Telegram__BotToken=YOUR_BOT_TOKEN_HERE \
telebot:latest
# Connect to LittleShop network
docker network connect littleshop-network telebot-service
9. Verify Deployment
# Wait for startup
sleep 15
# Check containers
docker ps --filter "name=littleshop" --filter "name=telebot"
# Test health endpoint
curl http://localhost:5100/api/version
# Check logs
docker logs littleshop --tail 50
docker logs telebot-service --tail 30
🏗️ Network Architecture
┌─────────────────────────────────────────────┐
│ CT109 Docker Host (10.0.0.51) │
│ │
│ ┌──────────────┐ ┌─────────────────┐ │
│ │ littleshop │◄─────┤ telebot-service │ │
│ │ :5000 │ │ │ │
│ └──────────────┘ └─────────────────┘ │
│ ▲ │ │
│ │ │ │
│ Port 5100 littleshop- │
│ (Host Access) network │
│ │ │
│ silverpay- │
│ network │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ SilverPay │ │
│ │ (10.0.0.51:5500) │ │
│ │ (NOT RUNNING) │ │
│ └───────────────────┘ │
└─────────────────────────────────────────────┘
🗄️ Database Management
Backup Database
# Backup CT109 database
docker run --rm -v littleshop-data:/data -v $(pwd):/backup alpine \
sh -c "cp /data/littleshop-dev.db /backup/littleshop-backup-$(date +%Y%m%d-%H%M%S).db"
Restore Database
# Restore from backup
docker run --rm -v littleshop-data:/data -v $(pwd):/backup alpine \
sh -c "cp /backup/littleshop-backup-YYYYMMDD-HHMMSS.db /data/littleshop-dev.db"
# Restart container
docker restart littleshop
Manual Database Reset
If you need to manually reset the database without redeploying:
# Stop containers
docker stop littleshop telebot-service
# Backup and delete volume
docker run --rm -v littleshop-data:/data -v $(pwd):/backup alpine \
sh -c "cp /data/littleshop-dev.db /backup/littleshop-backup-$(date +%Y%m%d-%H%M%S).db"
docker volume rm littleshop-data
# Restart containers (fresh database will be created)
docker start littleshop
docker start telebot-service
⚙️ Configuration
Environment Variables
LittleShop:
ASPNETCORE_ENVIRONMENT- Development | ProductionASPNETCORE_URLS- http://+:5000ConnectionStrings__DefaultConnection- Database pathJwt__Key- JWT signing key (32+ characters)
TeleBot:
LittleShop__ApiUrl- http://littleshop:5000LittleShop__UseTor- falseTelegram__BotToken- From Gitea secrets
SilverPay Integration
See SILVERPAY_SETUP.md for configuration guide.
Bot Registration
See BOT_REGISTRATION.md for first-time bot setup.
🔍 Monitoring & Troubleshooting
View Logs
# Real-time logs
docker logs -f littleshop
docker logs -f telebot-service
# Last 100 lines
docker logs --tail=100 littleshop
Health Checks
# LittleShop API health
curl http://localhost:5100/api/version
# Expected output:
# {"version":"1.0.0","environment":"Development"}
# Product catalog (should be empty on fresh deploy)
curl http://localhost:5100/api/catalog/products
# Expected output:
# {"items":[],"totalCount":0}
Common Issues
"Name or service not known"
Symptom: TeleBot can't connect to LittleShop
Solution: Verify both containers are on littleshop-network:
docker inspect littleshop | grep NetworkMode
docker inspect telebot-service | grep NetworkMode
# Should both show: littleshop-network
"Connection refused on port 5000"
Symptom: TeleBot gets connection refused
Solution: Verify LittleShop is listening on port 5000:
docker exec littleshop netstat -tlnp | grep 5000
# Or check environment
docker exec littleshop env | grep ASPNETCORE_URLS
# Should output: ASPNETCORE_URLS=http://+:5000
Sample Data Appears
Symptom: Products/categories pre-populated
Solution: Verify environment is set to Production or Development:
docker exec littleshop env | grep ASPNETCORE_ENVIRONMENT
# Should output: ASPNETCORE_ENVIRONMENT=Development
# (Sample data is disabled in both Development and Production since commit c4caee9)
🎯 Deployment Checklist
Before deploying:
- All code changes committed and pushed to git
- Gitea secrets configured (bot token, SSH key, etc.)
- SilverPay integration configured (if needed)
- Bot token valid for environment (CT109 vs Production)
- Network names correct (no docker-compose prefix confusion)
- Confirm fresh database is acceptable (data will be lost)
After deployment:
- Health check passes (
/api/versionreturns 200) - Product catalog is empty (0 products)
- Admin panel accessible (default: admin/admin)
- TeleBot connects successfully to LittleShop API
- Bot registration workflow tested
📚 Additional Documentation
- CI/CD Details: CI_CD_CT109_PREPRODUCTION.md
- E2E Test Results: CT109_E2E_TEST_RESULTS.md
- SilverPay Setup: SILVERPAY_SETUP.md
- Bot Registration: BOT_REGISTRATION.md
- Deployment Checklist: DEPLOYMENT-CHECKLIST.md
🆘 Getting Help
If deployment fails:
- Check Gitea Actions logs for detailed error messages
- SSH to CT109 and check container logs
- Verify all Gitea secrets are correctly configured
- Review network connectivity between containers
- Confirm database volume was successfully deleted/recreated