{"id":21938868,"url":"https://github.com/gabrielbaute/samanphotos","last_synced_at":"2026-04-13T20:02:59.862Z","repository":{"id":265236613,"uuid":"895320416","full_name":"gabrielbaute/samanphotos","owner":"gabrielbaute","description":"A clone of Google Photos based on python (Flask) and Bulma CSS","archived":false,"fork":false,"pushed_at":"2025-03-29T03:53:52.000Z","size":1339,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-08T17:02:35.091Z","etag":null,"topics":["bulma-css","flask","python","self-hosted"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabrielbaute.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-11-28T01:37:32.000Z","updated_at":"2025-03-29T03:53:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"0c9544de-fc30-4d64-a314-775b34905263","html_url":"https://github.com/gabrielbaute/samanphotos","commit_stats":null,"previous_names":["gabrielbaute/samanphotos"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gabrielbaute/samanphotos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielbaute%2Fsamanphotos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielbaute%2Fsamanphotos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielbaute%2Fsamanphotos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielbaute%2Fsamanphotos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabrielbaute","download_url":"https://codeload.github.com/gabrielbaute/samanphotos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielbaute%2Fsamanphotos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31768657,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bulma-css","flask","python","self-hosted"],"created_at":"2024-11-29T02:15:17.356Z","updated_at":"2026-04-13T20:02:59.857Z","avatar_url":"https://github.com/gabrielbaute.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🐍 **SamanPhotos** 📸\n![License](https://img.shields.io/badge/License-MIT-blue.svg)\n![Python](https://img.shields.io/badge/Python-3.13-blue.svg)\n![Flask](https://img.shields.io/badge/Framework-Flask-green.svg)\n![Docker](https://img.shields.io/badge/Container-Docker-blue.svg)\n![Bulma](https://img.shields.io/badge/CSS%20Framework-Bulma-00D1B2.svg)\n![Status](https://img.shields.io/badge/Status-En%20desarrollo-yellow.svg)\n\n¡Bienvenidos! SamanPhotos es un proyecto personal desarrollado para aprender y mejorar mis habilidades en Python y en el desarrollo de aplicaciones web. La aplicación permite a los usuarios subir, gestionar y visualizar fotos, además de proporcionar varias características adicionales como la geolocalización de las fotos y la descarga de imágenes. Ya iremos agregando más cosas en el futuro. La estética y apariencia es en base a [Bulma-CSS](https://bulma.io/)\n\n## **Funcionalidades** ✨\n\n- **🔐Autenticación de Usuarios**: Registro e inicio de sesión de usuarios. También se incluye información de seguridad como historial de sesiones y registro de auditoría como cambios de contraseñas.\n- **📁Gestión de Fotos y Álbumes**: Subir, visualizar, eliminar y crear álbumes de fotos.\n- **🗺️Geolocalización**: Visualización de fotos en un mapa interactivo utilizando OpenStreetMap.\n- **⬇️Descarga de Fotos**: Descargar fotos individuales con su nombre original.\n- **🔍Información de Seguridad**: Visualización de datos de inicio de sesión como la última IP, fecha de último inicio de sesión, etc.\n\nOtras funcionalidades de backend ya han sido agregadas, como un log del sistema, un panel de administrador para consultar el log sin tener que acceder al directorio raíz, estadísticas de los usuarios y la implementación de un servidor para producción (waitress, pronto soporte para gunicorn).\n\n## **En desarrollo** 🚧\n\n- **🔌API**: ⚠️ En desarrollo, de momento cumple con las funciones básicas CRUD, pero no se ha probado.\n- **👷Face Recognition**: ⚠️ En desarrollo, se están usando las librerías dlib y face-recognition, pero aún hay mucho que aprender sobre cómo usar esta biblioteca, si tienen alguna idea o alternativas, es bienvenida! (estoy desarrollando esto en un entorno Windows).\n- **📅Recuerdos**: 🚧 Apenas estamos comenzando.\n- **✏️Edición de Perfil**: 🚧 Detenido, pronto retomaremos esta parte.\n- **📫Confirmación de cuenta mediante token**: ✅ Completado.\n\n## **Problemas a corregir**\n\nEl proyecto aún tiene algunos problemas, como lo que respecta al manejo de albumes, en los que aún falta mucho por desarrollar, y hay algunos bugs presente (no he logrado crear correctamente los albumes cuando se suben fotos al mismo tiempo en el formulario). \n\n## **Instalación** ⚙️\n\n1. Clonar el repositorio:\n   ```bash\n   git clone https://github.com/gabrielbaute/samanphotos\n   cd SamanPhotos\n   ```\n\n2. Crear y activar un entorno virtual:\n   ```bash\n   python3 -m venv venv\n   source venv/bin/activate  # En Windows usa `venv\\Scripts\\activate`\n   ```\n\n3. Instalar las dependencias:\n   ```bash\n   pip install -r requirements.txt\n   ```\n\n4. Configurar las variables de entorno:\n   Crea un archivo `.env` en el directorio raíz del proyecto y añade las siguientes variables:\n   \n   | Variable | Descripción |\n   |----------|-------------|\n   | `SECRET_KEY` | Clave secreta para la seguridad de la aplicación |\n   | `SQLALCHEMY_DATABASE_URI` | URI de la base de datos SQLite |\n   | `MAIL_SERVER` | Servidor SMTP para el envío de correos |\n   | `MAIL_PORT` | Puerto del servidor SMTP |\n   | `MAIL_USERNAME` | Nombre de usuario del correo |\n   | `MAIL_PASSWORD` | Contraseña del correo |\n   | `MAIL_USE_TLS` | Usar TLS (True/False) |\n   | `MAIL_USE_SSL` | Usar SSL (True/False) |\n   | `MAIL_DEFAULT_SENDER` | Remitente predeterminado del correo |\n   | `SECURITY_PASSWORD_SALT` | Sal para la seguridad de las contraseñas |\n   | `JWT_SECRET_KEY` | Clave secreta para JWT |\n   | `ADMIN_EMAIL` | Correo electrónico del administrador |\n   | `ADMIN_PASSWORD` | Contraseña del administrador |\n   | `UPLOAD_FOLDER` | Carpeta para las subidas de fotos |\n\n5. Generar claves secretas:\n   Utiliza el script `generate_keys.py` para generar los valores de `SECRET_KEY`, `JWT_SECRET_KEY` y `SECURITY_PASSWORD_SALT`.\n   ```bash\n   python generate_keys.py\n   ```\n\n6. Ejecutar la aplicación:\n   ```bash\n   py production.py\n   ```\n\n   Si requieres realizar pruebas o probar un entorno de desarrollo, ejecuta:\n   ```bash\n   py run.py\n   ```\n\n## **Futuras Mejoras** 🚀\n\n- **💄Mejora de la UI**: Refinar la interfaz de usuario para una mejor experiencia. El objetivo es que se asemeje un poco a Google Photos, si bien Bulma (el framework css que estoy usando) quizás no sea lo más apropiado para esto. Con el tiempo, en la medida en que se pula la parte estética y se agreguen más funciones, decidiré si mantengo la estética minimalista de Bulma o si logro implementar un diseño más semejante a Google.\n- **☁️Soporte para Otros Proveedores de Almacenamiento**: Añadir soporte para almacenamiento en la nube como AWS S3.\n- **🔔Notificaciones**: Implementar notificaciones por correo electrónico para eventos importantes, recuerdos, etc.\n- **🔐Seguridad**: Hay muchas mejoras que se pueden realizar en el plan ode la seguridad. Sin embargo, aún estamos discutiendo cuántos de estos elementos pueden ser necesarios, como un 2FA o iniciar sesión mediante aplicaciones de terceros (Google, Microsoft, Github, etc). Parte de las funciones necesarias para el 2FA (usando autenticador de google, por ejemplo) ya están dentro del código, pero no se han implementado aún.\n\n## **Deploy en Docker**\n\nEsta primera versión del servidor está pensada para desplegarse en docker y operar como web primeramente. Estamos en fase de evaluación, así que si prueban el servicio e implementan cambios que ven funcionales o soluciones prácticas, agradecemos cualquier contribución o comentario.\n\n## Cómo Desplegar la Aplicación en Docker\n\n### Prerrequisitos\nAsegúrate de tener instalado lo siguiente:\n- [Docker](https://www.docker.com/) (versión 20+ recomendada).\n- [Docker Compose](https://docs.docker.com/compose/) (versión 3.8+ recomendada).\n\n### Instrucciones para Despliegue\n\n#### 1. Clona el repositorio\nPrimero, descarga el código fuente desde el repositorio:\n\n```bash\ngit clone https://github.com/gabrielbaute/samanphotos\ncd samanphotos\n```\n\n#### 2. Configura las variables de entorno\nEdita el archivo `.env` en el directorio raíz del proyecto con las siguientes variables:\n\n```env\nFLASK_ENV=production\nPORT=5000\nDEBUG=False\nSQLALCHEMY_DATABASE_URI=sqlite:////app/instance/octopus.db\nSECRET_KEY=tu_clave_secreta_segura\n```\n\n#### 3. Construye y ejecuta los contenedores\nUsa Docker Compose para construir las imágenes y levantar los servicios:\n\n```bash\ndocker-compose up --build\n```\n\nEsto realizará las siguientes acciones:\n- Construirá la imagen de la aplicación Flask desde el Dockerfile.\n- Montará los volúmenes locales necesarios (`instance`, `logs`, `uploads`).\n- Expondrá la aplicación en el puerto definido (por defecto, `5000`).\n\n#### 4. Accede a la aplicación\nUna vez que los contenedores estén en funcionamiento, accede a la aplicación desde tu navegador en la dirección:\n\n```\nhttp://localhost:5000\n```\n\n\u003e Nota: Si cambias el puerto en el archivo `.env`, actualiza también el URL.\n\n#### 5. Verifica el estado de los contenedores\nUsa el siguiente comando para verificar los contenedores en ejecución:\n\n```bash\ndocker ps\n```\n\nEsto mostrará información como el nombre del contenedor y el puerto en el que está escuchando.\n\n#### 6. Detén los servicios\nCuando quieras detener la aplicación, usa:\n\n```bash\ndocker-compose down\n```\n\nEsto eliminará los contenedores activos, pero conservará los datos en los volúmenes (`instance`, `logs`, `uploads`).\n\n---\n\n### Solución de Problemas\n\n#### El contenedor no inicia\nVerifica los logs del contenedor para diagnosticar problemas:\n\n```bash\ndocker logs samanphotos\n```\n\n#### El servicio no responde en el navegador\nAsegúrate de que el puerto definido en `.env` esté correctamente expuesto y no esté bloqueado por tu firewall.\n\n#### Necesito reconstruir la imagen\nSi realizas cambios en el código fuente y necesitas reconstruir la imagen, ejecuta:\n\n```bash\ndocker-compose up --build\n```\n\n---\n\n### Notas Adicionales\n- **Entorno de Producción:** Este despliegue está configurado para producción usando `waitress` como servidor. Puedes ajustar el archivo `production.py` para otras configuraciones específicas.\n- **Persistencia de Datos:** Los volúmenes montados aseguran que la base de datos SQLite, los logs y las fotos subidas permanezcan incluso después de detener los contenedores.\n- **Extensiones:** Si decides usar una base de datos diferente (como PostgreSQL), puedes extender el archivo `docker-compose.yml` para incluir un servicio adicional.\n\n---\n\n## **Contribuciones** 🙌\n\nCualquier sugerencia o feedback es bienvenido para mejorar y aprender más en este camino de desarrollo. Tengo poco menos de un año dedicado (de forma más constante) al estudio de Python y el desarrollo de aplicaciones, aunque manejo el lenguaje desde hace por lo menos dos. El desarrollo de este tipo de aplicaciones es, por los momentos, una tarea que emprendo por puro deseo de aprender y resolver problemas que se me presentan a mi o a personas que conozco. Cualquier contribución, corrección, observación y/o acotación es totalmente bienvenida.\n\n## **Autor** 🧑‍💻\n\nProyecto desarrollado por [Gabriel Baute](https://github.com/gabrielbaute). Si tienes alguna pregunta, no dudes en contactarme a través de mi [gabrielbaute@gmail.com](mailto:gabrielbaute@gmail.com).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielbaute%2Fsamanphotos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabrielbaute%2Fsamanphotos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielbaute%2Fsamanphotos/lists"}