feat: Release version 1.3.1 with Docker optimization and comprehensive documentation

- Update version to 1.3.1 in package.json and docker-compose.yml
- Optimize Dockerfile with proper data directory structure for production
- Add comprehensive Docker documentation (DOCKER.md)
- Include deployment and backup scripts (deploy.sh, backup.sh)
- Add .env.example for environment configuration
- Improve README with detailed deployment instructions
- Fix database path handling for Docker production environment
- Add health checks and proper Docker Compose configuration
- Remove development task documentation
- Update .gitignore to exclude backup directories

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Marco Gallegos
2025-08-25 18:40:44 -06:00
parent edf1be22fb
commit bbcd85eff7
10 changed files with 261 additions and 16 deletions

8
.env.example Normal file
View File

@@ -0,0 +1,8 @@
# Variables de entorno para AP-POS
# Copiar este archivo como .env y configurar los valores
# Clave secreta para las sesiones (CAMBIAR en producción)
SESSION_SECRET=tu-clave-secreta-muy-segura-cambiala-en-produccion
# Entorno de ejecución
NODE_ENV=production

1
.gitignore vendored
View File

@@ -3,6 +3,7 @@
# Local Database # Local Database
ap-pos.db ap-pos.db
backups/
# Docmuentation tasks # Docmuentation tasks
dev-tasks.md dev-tasks.md

92
DOCKER.md Normal file
View File

@@ -0,0 +1,92 @@
# Guía de Docker para AP-POS
## Configuración inicial
1. **Configurar variables de entorno**:
```bash
cp .env.example .env
# Editar .env con tus valores específicos
```
2. **Construir y levantar los servicios**:
```bash
docker-compose up -d --build
```
3. **Verificar que esté funcionando**:
```bash
docker-compose ps
docker-compose logs ap-pos
```
4. **Acceder a la aplicación**:
- URL: http://localhost:3111
- Primera vez: será redirigido a `/setup.html` para crear el usuario admin
## Comandos útiles
### Ver logs en tiempo real
```bash
docker-compose logs -f ap-pos
```
### Reiniciar el servicio
```bash
docker-compose restart ap-pos
```
### Detener y eliminar todo
```bash
docker-compose down
```
### Backup de la base de datos
```bash
# Crear backup
docker-compose exec ap-pos cp /app/data/ap-pos.db /app/data/backup-$(date +%Y%m%d_%H%M%S).db
# O desde el host
docker cp ap-pos:/app/data/ap-pos.db ./backup-ap-pos.db
```
### Restaurar base de datos
```bash
# Detener el servicio
docker-compose stop ap-pos
# Restaurar desde backup
docker cp ./backup-ap-pos.db ap-pos:/app/data/ap-pos.db
# Reiniciar
docker-compose start ap-pos
```
## Persistencia de datos
- La base de datos SQLite se almacena en el volumen Docker `ap_pos_data`
- Los datos persisten entre reinicios del contenedor
- El volumen se mantiene incluso si el contenedor se elimina
## Troubleshooting
### El contenedor no inicia
```bash
# Ver logs detallados
docker-compose logs ap-pos
# Verificar el health check
docker-compose ps
```
### Problemas de permisos
```bash
# Verificar permisos del volumen
docker-compose exec ap-pos ls -la /app/data/
```
### Reset completo
```bash
# CUIDADO: Esto elimina todos los datos
docker-compose down -v
docker-compose up -d --build
```

View File

@@ -16,9 +16,10 @@ RUN npm ci --omit=dev && npm cache clean --force
# 6. Copiar el resto de la aplicación # 6. Copiar el resto de la aplicación
COPY . . COPY . .
# 7. Crear usuario no root y darle permisos # 7. Crear directorio para la base de datos y usuario no root
RUN addgroup -S app && adduser -S app -G app \ RUN mkdir -p /app/data && \
&& chown -R app:app /app addgroup -S app && adduser -S app -G app && \
chown -R app:app /app
USER app USER app
# 8. Exponer el puerto # 8. Exponer el puerto

View File

@@ -26,14 +26,31 @@ El sistema está diseñado para ser desplegado fácilmente utilizando Docker y D
### Pasos para el despliegue ### Pasos para el despliegue
1. Clona o descarga este repositorio en tu máquina local. 1. **Clona o descarga** este repositorio en tu máquina local.
2. Abre una terminal y navega hasta el directorio raíz del proyecto.
3. Ejecuta el siguiente comando para construir y levantar el contenedor de la aplicación en segundo plano:
```bash 2. **Configura las variables de entorno**:
docker-compose up -d --build ```bash
``` cp .env.example .env
# Edita el archivo .env con una clave secreta segura
```
4. Una vez que el comando termine, la aplicación estará disponible en tu navegador en la dirección `http://localhost:3000`. 3. **Construye y levanta** el contenedor:
```bash
docker-compose up -d --build
```
La base de datos y toda la información se almacenarán localmente dentro de los volúmenes de Docker gestionados por `docker-compose`. 4. **Verifica que esté funcionando**:
```bash
docker-compose ps
docker-compose logs ap-pos
```
5. **Accede a la aplicación**:
- URL: `http://localhost:3111`
- En la primera ejecución serás redirigido a `/setup.html` para crear el usuario administrador
### Persistencia de datos
- La base de datos SQLite se almacena en un volumen Docker persistente
- Los datos se mantienen entre reinicios y actualizaciones del contenedor
- Para más información sobre Docker, consulta [DOCKER.md](./DOCKER.md)

53
backup.sh Executable file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
# Script de backup para AP-POS
# Crea backup de la base de datos SQLite
set -e
BACKUP_DIR="./backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup-ap-pos-${TIMESTAMP}.db"
echo "💾 Creando backup de la base de datos AP-POS..."
# Crear directorio de backups si no existe
mkdir -p "$BACKUP_DIR"
# Verificar que el contenedor esté corriendo
if ! docker compose ps ap-pos | grep -q "running"; then
echo "❌ Error: El contenedor ap-pos no está corriendo"
echo " Ejecuta: docker compose up -d"
exit 1
fi
# Crear backup desde el contenedor
echo "📋 Copiando base de datos..."
docker compose exec -T ap-pos cp /app/data/ap-pos.db /tmp/backup.db
# Copiar al host
docker compose cp ap-pos:/tmp/backup.db "${BACKUP_DIR}/${BACKUP_FILE}"
# Limpiar archivo temporal
docker compose exec -T ap-pos rm /tmp/backup.db
# Verificar que el backup se creó correctamente
if [ -f "${BACKUP_DIR}/${BACKUP_FILE}" ]; then
BACKUP_SIZE=$(ls -lh "${BACKUP_DIR}/${BACKUP_FILE}" | awk '{print $5}')
echo "✅ Backup creado exitosamente:"
echo " 📁 Archivo: ${BACKUP_DIR}/${BACKUP_FILE}"
echo " 📊 Tamaño: ${BACKUP_SIZE}"
# Mostrar backups disponibles
echo ""
echo "📂 Backups disponibles:"
ls -lht "${BACKUP_DIR}"/ | head -10
else
echo "❌ Error: No se pudo crear el backup"
exit 1
fi
# Opcional: Limpiar backups antiguos (mantener solo los últimos 10)
echo "🧹 Limpiando backups antiguos (manteniendo los últimos 10)..."
ls -t "${BACKUP_DIR}"/backup-ap-pos-*.db 2>/dev/null | tail -n +11 | xargs -r rm
echo "✅ Limpieza completada"

59
deploy.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/bin/bash
# Script de despliegue para AP-POS
# Autor: Sistema AP-POS
set -e # Exit on any error
echo "🚀 Desplegando AP-POS con Docker..."
# Verificar que Docker esté instalado
if ! command -v docker &> /dev/null; then
echo "❌ Error: Docker no está instalado"
echo " Instalar desde: https://docs.docker.com/get-docker/"
exit 1
fi
# Verificar que Docker Compose esté disponible
if ! docker compose version &> /dev/null; then
echo "❌ Error: Docker Compose no está disponible"
echo " Instalar desde: https://docs.docker.com/compose/install/"
exit 1
fi
# Crear archivo .env si no existe
if [ ! -f .env ]; then
echo "📝 Creando archivo .env desde template..."
cp .env.example .env
echo "⚠️ IMPORTANTE: Edita el archivo .env con una clave secreta segura antes de usar en producción"
fi
# Detener contenedores existentes si están corriendo
echo "🔄 Deteniendo contenedores existentes..."
docker compose down 2>/dev/null || true
# Construir y levantar los servicios
echo "🏗️ Construyendo y levantando servicios..."
docker compose up -d --build
# Esperar un poco para que el servicio inicie
echo "⏳ Esperando que el servicio inicie..."
sleep 10
# Verificar el estado
echo "🔍 Verificando estado del servicio..."
docker compose ps
# Mostrar logs recientes
echo "📋 Logs recientes:"
docker compose logs --tail=20 ap-pos
# Verificar que el servicio responde
echo "🏥 Verificando conectividad..."
if curl -s -o /dev/null -w "%{http_code}" http://localhost:3111/login.html | grep -q "200"; then
echo "✅ ¡Despliegue exitoso!"
echo "🌐 Aplicación disponible en: http://localhost:3111"
echo "📖 Para más información, consulta DOCKER.md"
else
echo "⚠️ El servicio está iniciando. Verifica con: docker compose logs ap-pos"
fi

View File

@@ -1,14 +1,22 @@
services: services:
ap-pos: ap-pos:
image: marcogll/ap_pos:1.3-latest image: marcogll/ap_pos:1.3.1
container_name: ap-pos container_name: ap-pos
restart: unless-stopped restart: unless-stopped
ports: ports:
- "3111:3111" - "3111:3111"
environment: environment:
NODE_ENV: production NODE_ENV: production
SESSION_SECRET: ${SESSION_SECRET:-your-very-secret-key-change-it-in-production}
volumes: volumes:
- ap_pos_data:/app/data - ap_pos_data:/app/data
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3111/login.html"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes: volumes:
ap_pos_data: ap_pos_data:
driver: local

View File

@@ -1,6 +1,6 @@
{ {
"name": "ap-pos", "name": "ap-pos",
"version": "1.0.0", "version": "1.3.1",
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"start": "node server.js" "start": "node server.js"

View File

@@ -25,8 +25,10 @@ app.use(session({
})); }));
// --- DATABASE INITIALIZATION --- // --- DATABASE INITIALIZATION ---
// Usar un path absoluto para asegurar que la DB siempre se cree en la carpeta del proyecto. // Usar un path que funcione tanto en desarrollo como en Docker
const dbPath = path.join(__dirname, 'ap-pos.db'); const dbPath = process.env.NODE_ENV === 'production'
? path.join(__dirname, 'data', 'ap-pos.db')
: path.join(__dirname, 'ap-pos.db');
console.log(`Connecting to database at: ${dbPath}`); console.log(`Connecting to database at: ${dbPath}`);
const db = new sqlite3.Database(dbPath, (err) => { const db = new sqlite3.Database(dbPath, (err) => {
@@ -144,7 +146,11 @@ function startServer() {
// Middleware para manejar la redirección a la página de configuración // Middleware para manejar la redirección a la página de configuración
const checkSetup = (req, res, next) => { const checkSetup = (req, res, next) => {
const allowedPaths = ['/setup.html', '/setup.js', '/api/setup', '/styles.css', '/src/logo.png', '/api/check-auth']; const allowedPaths = [
'/setup.html', '/setup.js', '/api/setup',
'/login.html', '/login.js', '/api/login',
'/styles.css', '/src/logo.png', '/api/check-auth'
];
if (needsSetup && !allowedPaths.includes(req.path)) { if (needsSetup && !allowedPaths.includes(req.path)) {
return res.redirect('/setup.html'); return res.redirect('/setup.html');
} }