diff --git a/.gitignore b/.gitignore index 3576349..7dae587 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ backend/.env.* frontend/.env frontend/.env.* !frontend/.env.example -android/local.properties android/keystore.properties android/*.jks android/*.keystore @@ -70,6 +69,7 @@ android_react/ios/ Thumbs.db .idea/ .codex +.tmp-venv/ .vscode/* !.vscode/extensions.json *.swp diff --git a/DEPLOY_ANDROID.md b/DEPLOY_ANDROID.md new file mode 100644 index 0000000..440ba55 --- /dev/null +++ b/DEPLOY_ANDROID.md @@ -0,0 +1,31 @@ +# Deploy Android + +## Pasos + +1. Haz los cambios en `dev`. +2. Prueba la app: + - `source /etc/profile.d/android-sdk.sh` + - `cd android` + - `GRADLE_USER_HOME=/home/mgonzalez/desarrollo/react/linkedsign/android/.gradle-home ./gradlew assembleDebug` +3. Si todo está bien, genera release: + - `GRADLE_USER_HOME=/home/mgonzalez/desarrollo/react/linkedsign/android/.gradle-home ./gradlew assembleRelease` +4. Copia el APK release: + - `cp android/app/build/outputs/apk/release/app-release.apk android/apk/LinkedSign-release.apk` +5. Guarda cambios en git: + - `git add .` + - `git commit -m "mensaje"` +6. Sube a Gitea: + - `git push origin main` +7. Sube el APK a producción: + - `scp -P 2203 android/apk/LinkedSign-release.apk deploy@192.168.222.3:/opt/apps/linkedsign/apk/` +8. Limpia archivos `.md` en producción: + - `find /opt/apps/linkedsign -type f -iname '*.md' -delete` +9. Verifica descarga pública: + - `https://sign.linkedcorp.net/api/downloads/android-apk` + +## Notas + +- La `keystore` de producción está fuera de git. +- No pierdas la `keystore` ni las contraseñas. +- Si cambias algo visual de la app, no hace falta tocar la web. +- Si cambias el contrato del API, prueba login, documentos y firma antes de subir release. diff --git a/DEPLOY_WEB.md b/DEPLOY_WEB.md new file mode 100644 index 0000000..197e52a --- /dev/null +++ b/DEPLOY_WEB.md @@ -0,0 +1,45 @@ +# Deploy Web + +## Pasos + +1. Haz los cambios en `dev`. +2. Prueba local: + - `cd frontend && npm run build` + - `cd ../backend && node -e "require('./src/app')"` +3. Guarda cambios en git: + - `git add .` + - `git commit -m "mensaje"` +4. Sube a Gitea: + - `git push origin main` +5. En el servidor app entra por SSH: + - `ssh deploy@192.168.222.3 -p 2203` +6. Actualiza código: + - `cd /opt/apps/linkedsign/source` + - `git fetch origin main` + - `git reset --hard origin/main` +7. Recompila frontend: + - `cd /opt/apps/linkedsign/source/frontend` + - `npm ci` + - `npm run build` +8. Publica frontend: + - `rm -rf /opt/apps/linkedsign/frontend/*` + - `cp -r dist /opt/apps/linkedsign/frontend/` + - `cp server.js /opt/apps/linkedsign/frontend/` +9. Publica backend: + - `rm -rf /opt/apps/linkedsign/backend/*` + - `cp -r /opt/apps/linkedsign/source/backend/* /opt/apps/linkedsign/backend/` + - `cd /opt/apps/linkedsign/backend` + - `npm ci --omit=dev` +10. Reinicia servicios: + - `sudo systemctl restart linkedsign-frontend` + - `sudo systemctl restart linkedsign-backend` +11. Limpia archivos `.md` en producción: + - `find /opt/apps/linkedsign -type f -iname '*.md' -delete` +12. Verifica: + - `curl -I http://127.0.0.1:3000` + - `curl http://127.0.0.1:4000/health` + +## Notas + +- Si cambias variables de entorno, actualiza `/opt/apps/linkedsign/backend/.env`. +- Si cambias rutas del APK o storage, revisa también `PRODUCCION.md`. diff --git a/PRODUCCION.md b/PRODUCCION.md new file mode 100644 index 0000000..c089a0c --- /dev/null +++ b/PRODUCCION.md @@ -0,0 +1,97 @@ +# Producción LinkedSign + +## Servidor de aplicación + +- Host: `192.168.222.3` +- SSH: `deploy@192.168.222.3 -p 2203` +- Ruta base: `/opt/apps/linkedsign` + +## Estructura en servidor + +- Código fuente: `/opt/apps/linkedsign/source` +- Frontend runtime: `/opt/apps/linkedsign/frontend` +- Backend runtime: `/opt/apps/linkedsign/backend` +- Storage persistente: `/opt/apps/linkedsign/storage` +- Logs: `/opt/apps/linkedsign/logs` + +## Servicios persistentes + +- Backend: `linkedsign-backend.service` +- Frontend: `linkedsign-frontend.service` + +## Puertos internos + +- Frontend: `127.0.0.1:3000` +- Backend: `127.0.0.1:4000` + +## Estado actual + +- Frontend local responde en `3000` +- Backend local responde en `4000` +- Ambos servicios quedaron `enabled` y `running` + +## Nginx Proxy Manager + +### Proxy host principal + +- Domain: `sign.linkedcorp.net` +- Forward Hostname/IP: `192.168.222.3` +- Forward Port: `3000` +- Scheme: `http` +- SSL: certificado para `sign.linkedcorp.net` + +### Custom location + +- Location: `/api` +- Forward Hostname/IP: `192.168.222.3` +- Forward Port: `4000` +- Scheme: `http` + +No hace falta rewrite. El backend ya acepta `/api`. + +## Base de datos + +- Host MariaDB: `192.168.222.32` +- Base de datos: `linkedsign` +- Usuario: `linkedsign_user` + +## Bloqueo pendiente + +MariaDB rechazó el acceso desde el servidor web: + +- Error: `Access denied for user 'linkedsign_user'@'192.168.222.3'` + +En el servidor MariaDB debes ejecutar: + +```sql +GRANT ALL PRIVILEGES ON linkedsign.* TO 'linkedsign_user'@'192.168.222.3' IDENTIFIED BY 'INa*hkFanYa_zICF'; +FLUSH PRIVILEGES; +``` + +Si quieres permitir desde más de un host del mismo segmento: + +```sql +GRANT ALL PRIVILEGES ON linkedsign.* TO 'linkedsign_user'@'192.168.222.%' IDENTIFIED BY 'INa*hkFanYa_zICF'; +FLUSH PRIVILEGES; +``` + +## Comandos útiles + +```bash +sudo systemctl status linkedsign-frontend +sudo systemctl status linkedsign-backend +sudo journalctl -u linkedsign-frontend -n 100 --no-pager +sudo journalctl -u linkedsign-backend -n 100 --no-pager +``` + +## Pendiente después del GRANT + +Cuando MariaDB permita acceso desde `192.168.222.3`, falta: + +1. Crear/validar tablas en producción. +2. Probar login real. +3. Confirmar operación completa del sistema. + +## Seguridad + +El token de Gitea usado durante esta preparación quedó expuesto en el chat. Debe rotarse. diff --git a/android/app/src/main/java/net/linkedcorp/linkedsign/ui/LinkedSignApp.kt b/android/app/src/main/java/net/linkedcorp/linkedsign/ui/LinkedSignApp.kt index 78b9d32..6ac841b 100644 --- a/android/app/src/main/java/net/linkedcorp/linkedsign/ui/LinkedSignApp.kt +++ b/android/app/src/main/java/net/linkedcorp/linkedsign/ui/LinkedSignApp.kt @@ -586,12 +586,14 @@ private fun AuthFlow( } ) } - Text( - "Servidor: ${BuildConfig.API_BASE_URL}", - color = Color(0xFF9CA3AF), - style = MaterialTheme.typography.bodySmall, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) + if (BuildConfig.DEBUG) { + Text( + "Servidor: ${BuildConfig.API_BASE_URL}", + color = Color(0xFF9CA3AF), + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + } } } }