commit 46901fbb7f59b970929f47d8387451be9ba36876 Author: admin Date: Tue Aug 4 19:24:21 2026 +0200 first commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/Guia_BorgBackup.md b/Guia_BorgBackup.md new file mode 100644 index 0000000..788e89d --- /dev/null +++ b/Guia_BorgBackup.md @@ -0,0 +1,386 @@ +# Guía Práctica de BorgBackup + +# https://www.borgbackup.org/ + +## ¿Qué es Borg? + +BorgBackup es una herramienta de backup deduplicado, incremental y +opcionalmente cifrado, diseñada para sistemas Unix/Linux. Es muy +eficiente en espacio y segura. + +--- + +# Instalación + +## Ubuntu / Debian + +```bash +sudo apt update +sudo apt install borgbackup +``` + +## Installar borgbackup offline +Desde otro ordenador con internet, ve a la página de releases de Borg en GitHub:https://github.com/borgbackup/borg/releasesDescarga +El binario correspondiente a tu arquitectura (normalmente borg-linux64 o borg-linux64-glibc228 si tu sistema es antiguo). +Elige la versión estable más reciente de la serie 1.x (actualmente alrededor de 1.4.x). +Copia el archivo al equipo sin internet (por USB, pendrive, red local, etc.). + +En el equipo objetivo: + +```bash +chmod +x borg-linux64 * hazlo ejecutable +sudo cp borg-linux64 /usr/local/bin/borg +sudo chown root:root /usr/local/bin/borgsudo +chmod 755 /usr/local/bin/borg +``` + +opcional (para el comando borgfs):sudo ln –s /usr/local/bin/borg /usr/local/bin/borgfs + +verifica: borg --version + + +## macOS (Homebrew) + +```bash +brew install borgbackup +``` + +Verificar instalación: + +```bash +borg --version +``` + +## Windows (WSL) + +En PowerShell como administrador: + +``` +wsl --install +``` + + +Reinicia el equipo si lo pide. +Instalar Borg dentro de Ubuntu (WSL) +Abre Ubuntu desde el menú inicio y ejecuta: + +``` +sudo apt update +sudo apt install borgbackup +``` + + +Verifica: + +``` +borg --version +``` + + +📂 Acceder a tus archivos de Windows desde WSL +Tus discos Windows están en: +/mnt/c +Ejemplo: + +``` + +borg create /mnt/d/backups/borg_repo::backup1 /mnt/c/Users/TU_USUARIO/Documents +``` + + + +Conceptos Importantes + +- \*\*Repositorio (Repo):\*\* Lugar donde se almacenan los backups. +- \*\*Archive (Snapshot):\*\* Cada backup individual dentro del + repositorio. +- \*\*Deduplicación:\*\* Solo guarda bloques nuevos o modificados. +- \*\*Incremental real:\*\* Cada backup parece completo, pero solo guarda + cambios. +- \*\*Prune:\*\* Elimina snapshots antiguos según reglas. +- \*\*Compact:\*\* Recupera espacio tras borrar snapshots. + +------------------------------------------------------------------------ + +Crear un Repositorio + +Con cifrado (recomendado) + +``` +borg init --encryption=repokey /ruta/al/repositorio +``` + +Sin cifrado + +```bash +borg init --encryption=none /ruta/al/repositorio +``` + +--- + +# Crear un Backup + +```bash +borg create --stats --progress /ruta/al/repositorio::nombre-backup /ruta/a/respaldar +``` + +Ejemplo: + +```bash +borg create --stats --progress /mnt/backup_usb/ocis_borg::ocis-2026-02-11 /srv/ocis +``` + +```bash +borg create --stats --progress \ +/mnt/backup_usb/ocis_borg::ocis-$(date +%Y-%m-%d_%H-%M) \ +/srv/ocis +``` + +```bash +borg create --stats --progress \ + /ruta/al/repositorio::backup-{now:%Y-%m-%d} \ + /ruta/a/respaldar +``` +Esto creará backups como: + +backup-2026-02-23 +backup-2026-02-24 + +### Opciones útiles + +- `--stats` → Muestra estadísticas al finalizar. +- `--progress` → Muestra progreso en tiempo real. +- `--compression lz4` → Compresión rápida (recomendado). +- `--dry-run` → Simulación sin ejecutar realmente. + +--- + +# Listar Backups Disponibles + +```bash +borg list /ruta/al/repositorio +``` + +--- + +# Restaurar Backup Completo + +```bash +cd / +borg extract /ruta/al/repositorio::nombre-backup +con progreso +borg extract --progress /ruta/al/repositorio::nombre-backup +``` + +--- + +# Restaurar Archivo o Carpeta Específica + +Se necesita FUSE: + +1. Linux sudo apt install fuse3 +2. WSL sudo apt install fuse3 +3. MacOs https://macfuse.github.io/ Montar snapshot: + +```bash +mkdir /mnt/tmp +borg mount /ruta/al/repositorio::nombre-backup /mnt/tmp +``` + +Explorar y copiar archivos necesarios. + +Desmontar: + +```bash +umount /mnt/tmp +``` + +Si se quiere restaurar en otra carpeta: +cd /tmp +borg extract /Users/jesus/test_repo::backup4 + +# Eliminar Backups Antiguos (Prune) + +Ejemplo típico: + +```bash +borg prune -v --list /ruta/al/repositorio --keep-daily=7 --keep-weekly=4 --keep-monthly=6 +``` + +Luego compactar: + +```bash +borg compact /ruta/al/repositorio +``` + +--- + +# Eliminar repositorio-backup + +Eliminar un repositorio Borg completo - carpeta + +```bash +rm -rf /mnt/backup_usb/ocis_borg +``` + +Borrar backups (archives) pero mantener el repo + +1. Borrar el repositorio completo Este comando elimina el repositorio junto con todos los archivos (archives) contenidos en él, además de borrar el caché local asociado. Comando estándar: + +```bash +borg delete /ruta/al/repositorio +``` + +En versiones más recientes (Borg 1.2+): Se recomienda usar el comando específico: + +```bash +borg repo-delete /ruta/al/repositorio +``` + +Usa el código con precaución. + +[!IMPORTANT] +Al ejecutarlo, el sistema te pedirá confirmación escribiendo YES en mayúsculas para proceder con la eliminación irreversible. +2. Opciones adicionales útiles +Simulación (--dry-run): Para ver qué se borraría sin ejecutar la acción real, usa: + +``` +bash +borg delete --list --dry-run /ruta/al/repositorio. +``` + +Conservar info de seguridad (--keep-security-info): Útil si planeas reemplazar un repositorio corrupto con una copia pero quieres mantener los contadores de seguridad (nonces) locales. +Solo caché local (--cache-only): Si solo quieres limpiar los archivos temporales locales del repositorio sin borrar los datos en el servidor/disco. +3\. Liberar espacio en disco +Si solo borraste archivos (archives) individuales dentro del repositorio y no el repositorio completo, el espacio no se liberará automáticamente. Debes ejecutar el comando de compactación: + +``` +bash +borg compact /ruta/al/repositorio +``` + +Borrar un backup específico: + +``` +bash +borg delete /mnt/backup_usb/ocis_borg::ocis-2026-02-11_18-30 +``` + +Después: (Para recuperar espacio real) + +``` +bash +borg compact /mnt/backup_usb/ocis_borg +``` + +--- + +# Verificar Integridad + +```bash +borg check /ruta/al/repositorio +``` + +--- + +# Exportar Clave (Si usas cifrado) + +```bash +borg key export /ruta/al/repositorio /ruta/segura/clave.key +``` + +⚠️ Si pierdes la passphrase y la clave, el backup no se puede recuperar. + +--- + +# Información de un repo + +```bash +borg info /Users/jesus/test_repo +``` + +Te mostrará algo como: +Repository ID: xxxxx +Location: /Users/jesus/test_repo + +Number of archives: 5 + +Original size: 120 GB +Compressed size: 80 GB +Deduplicated size: 10 GB + +Ver tamaño de cada backup individual + +```bash +borg info /Users/jesus/test_repo::backup4 +``` + +--- + +IMPORTANTE PARA MANTENER ESTRUCTURA DE CARPETAS: + +### Hacer backup desde `/` + +``` +cd / +borg create /mnt/backup_usb/borg_repo::ocis-$(date +%F_%H-%M) srv/ocis +``` + +--- + +### Restaurar + +``` +cd / +borg extract /mnt/backup_usb/borg_repo::ocis-xxxx +``` + +Si haces: + +``` +cd /srv/ocis +borg create repo::backup . +``` + +### Opciones útiles: + +Ver qué contiene un backup: +```borg list /backups/repositorio::backup-2026-05-09``` + +Extraer sin preservar permisos/owner: +```borg extract --numeric-ids --noacls --noxattrs ...``` +Mostrar progreso: +```borg extract --progress /destino repo::archivo``` + + +# Buenas Prácticas + +- Probar restauraciones periódicamente. +- Guardar la passphrase en lugar seguro. +- No guardar el backup en el mismo disco que los datos. +- Desmontar correctamente discos externos. +- Usar cifrado si el disco puede perderse o salir del entorno físico. + +--- + +# Flujo Típico de Uso Manual + +1. Montar disco externo. +2. Parar servicio (ej. Docker). +3. Ejecutar `borg create`. +4. Arrancar servicio. +5. Desmontar disco. + +--- + +# Resumen + +Borg es: + +- Rápido +- Seguro +- Incremental +- Deduplicado +- Ideal para servidores Linux y Docker + +Un backup no probado no es un backup. \ No newline at end of file diff --git a/Guia_Go.md b/Guia_Go.md new file mode 100644 index 0000000..51694b8 --- /dev/null +++ b/Guia_Go.md @@ -0,0 +1,51 @@ +**AYUDA Go** +========= + +**https://https://go.dev/ + +------------------- + +**Flujo correcto siempre en Go** + +Cada proyecto: + +mkdir mi-proyecto\ +cd mi-proyecto\ +go mod init nombre\ +go get dependencia\ +go run main.go + +-------- + +go mod init agenda +go get modernc.org/sqlite +go run agenda.go + +⚠️ MUY IMPORTANTE (para SQLite) +Recuerda esto o te dará error después: +sudo apt install build-essential + +**Crear ejecutable** + +Dentro de tu proyecto: +go build -o agenda +Esto genera: +agenda + +▶️ Ejecutarlo +./agenda + +🪟 Para Windows +go build -o agenda.exe + +🌍 Cross-compiling (MUY potente) +Puedes compilar para otros sistemas desde Linux: + +Windows: +GOOS=windows GOARCH=amd64 go build -o agenda.exe +Linux: +GOOS=linux GOARCH=amd64 go build -o agenda +Mac: +GOOS=darwin GOARCH=amd64 go build -o agenda + +------------------- diff --git a/Guia_alpine_linux.md b/Guia_alpine_linux.md new file mode 100644 index 0000000..9289b86 --- /dev/null +++ b/Guia_alpine_linux.md @@ -0,0 +1,47 @@ + + +#### Scripts instalacion Alpine-linux + + +**Descargar iso: alpine-standard-3.22.2-aarch64.iso** + +User: root +password: rootpass + +**Instalación basica** +setup-alpine + +Zona horaria Europe/Madrid + +User: user +password: userpass + +**Instalar escritorio** +setup-desktop +Which desktop environment? ('gnome', 'plasma', 'xfce', 'mate', 'sway', 'lxqt' or 'none') [none] +xfce + + +**Idioma español** +apk add nano lang hunspell-lang +cd /etc/profile.d/ +nano 20locale.sh +doas cp 20locale.sh 20locale\_backup.sh +doas nano 20locale.sh +``` +export CHARSET=UTF-8 +export LANG=es\_ES.UTF-8 +export LC\_COLLATE=es\_ES.UTF-8 +``` + +cd /etc/ +doas nano environment +LANG=es\_ES.UTF-8 + +**Sonido** +doas apk add pulseaudio pulseaudio-alsa +doas apk add xfce4-whiskermenu-plugin xfce4-screenshooter xfce4-pulseaudio-plugin +Reboot y quitar la carga de la iso + +**Iniciar entorno grafico** +starx (iniciar entorno grafico) diff --git a/Guia_cloudflared.md b/Guia_cloudflared.md new file mode 100644 index 0000000..14ca563 --- /dev/null +++ b/Guia_cloudflared.md @@ -0,0 +1,142 @@ + + +La configuración del tunel se guarda en: + +~.cloudflared/archivos.json + +~/.cloudflared/config.yml + +Iniciar tunel + +cloudflared tunnel run nombre\_tunel + +Instalar tunel como servicio + +cloudflared service install + +Creara servicio llamado cloudflared.service + +sudo systemctl start cloudflared - iniciar el tunel + +sudo systemctl stop cloudflared - detener el tunel + +sudo systemctl restart cloudflared - reiniciar tunel + +sudo systemctl status cloudflared - estado tunel + +cloudflared tunnel list - Lista los tuneles + +cloudlared tunnel delete nombre\_tunel - Elimina tunel + +Borrar archivos locales + +rm ~/.cloudflared/nombre\_tunel.json + +rm ~/.cloudflared/config.yml + +sudo systemctl disable cloudflared - desactiva servicio sistema + +sudo systemctl stop cloudflared - detiene servicio + +Eliminar servicio del sistema + +sudo rm /etc/systemd/system/cloudflared.service + +sudo systemctl daemon-reexec + +Conectarse por SSH + +Opcion 1 + +linux + +ssh -o Proxycommand="cloudflared access tcp --hostname ssh.xiberus.com" usuario@localhost + +Windows - Descargar cloudflared.exe + +ssh -o Proxycommand="cloudflared.exe access tcp --hostname ssh.xiberus.com" usuario@localhost + + +\----------------- + +metodo 2 desde la web + +1. nuevo tunel +1. Instalar y ejecutar el conector (debian) +1. crear el tunel +1. cloudflared tunnel login. (terminal) +1. indica una URL en la terminal, copiarla en navegador para autorizar en cloudflared el tunel. + + +sudo mkdir -p /etc/cloudflared + +sudo nano /etc/cloudflared/config.yml + + + +\------------------ + +Metodo que ha funcionado + + +cloudflared tunnel login + +cloudflared tunnel create xiberus-tunnel + +Cloudflared tunnel list + +sudo nano /home/jesus/.cloudflared/config.yml + + +tunnel: 1cfce1cf-b10e-4c52-ae2e-e89d733149e5 + +credentials-file: /home/jesus/.cloudflared/1cfce1cf-b10e-4c52-ae2e-e89d733149e5.json + +/root/.cloudflared/config.yml + +tunnel: xiberus-tunnel + +credentials-file: /root/.cloudflared/.json + +ingress: + +- hostname: server.xiberus.com + +service: http://localhost:80 # o el puerto que uses (ej. panel Pterodactyl, etc) + +- hostname: portainer.xiberus.com + +service: https://localhost:9443 + +originRequest: + +noTLSVerify: true # Importante porque Portainer usa self-signed por defecto + +- service: http\_status:404 + +Añadir las dos + +cloudflared tunnel route dns xiberus-tunnel server.xiberus.com + +cloudflared tunnel route dns xiberus-tunnel portainer.xiberus.com + + + +cloudflared service install + +sudo systemctl start cloudflared + +sudo systemctl enable cloudflared + +cloudflared tunnel run + +\-------- + +cloudflared tunnel list + +systemctl status cloudflared -l + +sudo systemctl restart cloudflared + + + diff --git a/Guia_django.md b/Guia_django.md new file mode 100644 index 0000000..6a3b8a2 --- /dev/null +++ b/Guia_django.md @@ -0,0 +1,207 @@ +AYUDA DJANGO + +\============ + +Proyecto Django: Blog Simple + +Este proyecto creará un blog básico donde los usuarios podrán ver una lista de publicaciones y acceder a los detalles de cada una. + +Paso 1: Instalar Django + +Si no tienes Django instalado, ejecuta: + +pip install django + +Paso 2: Crear un Proyecto Django + +django-admin startproject blog\_project + +cd blog\_project + +Paso 3: Crear la Aplicación del Blog + +python manage.py startapp blog + +Registre la aplicación en blog\_project/settings.pydentro de INSTALLED\_APPS: + +INSTALLED\_APPS = [ + +'django.contrib.admin', + +'django.contrib.auth', + +'django.contrib.contenttypes', + +'django.contrib.sessions', + +'django.contrib.messages', + +'django.contrib.staticfiles', + +'blog', # Agregamos nuestra aplicación + +] + +Paso 4: Definir el modelo de publicación + +Edita blog/models.py: + +from django.db import models + +class Post(models.Model): + +title = models.CharField(max\_length=200) + +content = models.TextField() + +created\_at = models.DateTimeField(auto\_now\_add=True) + +def \_\_str\_\_(self): + +return self.title + +Aplica las migraciones para crear la tabla en la base de datos: + +python manage.py makemigrations + +python manage.py migrate + +Paso 5: Registrar el Modelo en el Panel de Administración + +Edita blog/admin.py: + +from django.contrib import admin + +from .models import Post + +admin.site.register(Post) + +Crea un superusuario: + +python manage.py createsuperuser + +Corre el servidor y accede al panel de administración en http://127.0.0.1:8000/admin: + +python manage.py runserver + +Desde ahí, puedes agregar publicaciones manualmente. + +Paso 6: Crear las Vistas y URL + +Edita blog/views.py: + +from django.shortcuts import render, get\_object\_or\_404 + +from .models import Post + +def lista\_posts(request): + +posts = Post.objects.all().order\_by('-created\_at') + +return render(request, 'blog/lista\_posts.html', {'posts': posts}) + +def detalle\_post(request, post\_id): + +post = get\_object\_or\_404(Post, id=post\_id) + +return render(request, 'blog/detalle\_post.html', {'post': post}) + +Crea blog/urls.py: + +from django.urls import path + +from . import views + +urlpatterns = [ + +path('', views.lista\_posts, name='lista\_posts'), + +path('post//', views.detalle\_post, name='detalle\_post'), + +] + +Registra las rutas en blog\_project/urls.py: + +from django.contrib import admin + +from django.urls import path, include + +urlpatterns = [ + +path('admin/', admin.site.urls), + +path('', include('blog.urls')), + +] + +Paso 7: Crear las Plantillas HTML + +Dentro de blog/templates/blog/, crea lista\_posts.html: + + + + + + + +Blog + + + + + +

Publicaciones

+ +
    + +{% for post in posts %} + +
  • + +{{ post.title }} + +({{ post.created\_at|date:"d M Y" }}) + +
  • + +{% endfor %} + +
+ + + + + +Crea detalle\_post.html: + + + + + + + +{{ post.title }} + + + + + +

{{ post.title }}

+ +

{{ post.created\_at|date:"d M Y" }}

+ +

{{ post.content }}

+ +Volver al blog + + + + + +Paso 8: Ejecutar el Proyecto + +Corre el servidor: + +python manage.py runserver + +Abre http://127.0.0.1:8000/y prueba la aplicación. diff --git a/Guia_docker.md b/Guia_docker.md new file mode 100644 index 0000000..84d3bbf --- /dev/null +++ b/Guia_docker.md @@ -0,0 +1,245 @@ +## AYUDA DOCKER + + + +docker desktop start        abrir docker desktop + +docker info                     verificar que docker esta corriendo + +docker ps                  # Ver contenedores en ejecución +docker ps -a                 # contenedores creados + +docker stop mi-web     # Parar el contenedor +docker start mi-web      # Iniciar el contenedor nuevamente +docker rm mi-web         # Eliminar el contenedor (cuando ya no lo necesites) + +docker images Imagenes existentes en local + +Dockerfile                  Archivo texto instrucciones crear imagen docker. + +docker build .             Construir una imagen a partir de Dockerfile + +docker login             Iniciar sesion docker hub +docker logout           Cerrar sesion docker hub + +docker pull nombreimagen:version descargar imagen docker +docker push nombreimagen publicar imagen +docker searh nombreimagen buscar imagen + +Iniciar un contenedor +docker run nombre_contenedor +docker run -d --name owncloud -p 8080:80 owncloud:latest + +Docker compose + +docker compose up -d +docker compose down Detiene y eliminar el contenedor + +docker stop vaultwarden # parar contenedor +docker start vaultwarden # arrancar contenedor +docker restart vaultwarden # reiniciar contenedor + +--- + +#### 🐳 Contenedores + +**Acceder a la terminal de un contenedor existente:** + +``` +docker exec -it /bin/bash +# O si bash no está disponible: +docker exec -it sh +``` + +docker exec -it nombrecontenedor whereis bash/sh + +docker exec -it caddy /bin/sh (para caddy por ejemplo cambia a sh) + + + +Comando largo - Alias corto Descripción + +docker container ls docker ps Listar contenedores en ejecución +docker container ls -a docker ps -a Listar todos los contenedores +docker container stop docker stop Parar un contenedor +docker container start docker start Arrancar un contenedor detenido +docker container restart docker restart Reiniciar un contenedor +docker container rm docker rm Eliminar un contenedor + + + +--- + +#### 📦 Imágenes + +Comando largo - Alias corto Descripción + +docker image ls docker images Listar imágenes +docker image rm docker rmi Eliminar una imagen +docker image prune (no tiene alias) Borrar imágenes no usadas + +Crear/levantar contenedor si ya tienes la imagen, sin dockerfile: +docker run -d \ +--name vaultwarden \ +-e DOMAIN="https://vw.domain.tld" \ +-v $(pwd)/vw-data:/data \ +-p 8000:80 \ +vaultwarden/server:latest + +--- + +#### 🔧 Volúmenes y redes (sin alias cortos) + +Comando largo - Descripción + +docker volume ls Listar volúmenes +docker volume rm Eliminar volumen +docker volume prune Limpiar volúmenes no usados +docker network ls Listar redes +docker network rm Eliminar red +docker network prune Limpiar redes no usadas + +--- + +#### 🔧 Opciones disponibles para restart + +Docker ofrece cuatro opciones principales para controlar el comportamiento de reinicio: + +no (por defecto) El contenedor no se reinicia nunca automáticamente, ni al fallar ni al reiniciar Docker. +always El contenedor siempre se reinicia, incluso si lo detuviste manualmente o al reiniciar Docker Desktop. +unless-stopped Igual que always, pero no se reinicia si tú lo detuviste manualmente antes de apagar Docker. +on-failure[:n] Solo se reinicia si el contenedor termina con error (exit code ≠ 0). Puedes limitar el número de intentos con :n. +Ejemplo: on-failure:5. + +--- + +#### Mover imagenes + +🔁 Mover una imagen Docker a otro equipo (recomendado) +Exportar la imagen a un archivo .tar +docker save -o nombre_imagen.tar nombre_imagen +Ejemplo: +docker save -o mi_app.tar mi_app:latest + +Importar la imagen en el segundo equipo +docker load -i nombre_imagen.tar +docker load -i mi_app.tar +docker run ... + +✅ Si quieres exportar la imagen con los datos +docker save flask-contactos > flask-contactos.tar +cp ./data/contacts.db contactos.db +En el nuevo equipo, haz: +docker load < flask-contactos.tar +mkdir data +cp contactos.db ./data/ + +docker run -d -p 5000:5000 -v $(pwd)/data:/data flask-contactos linux +docker run -d -p 5000:5000 -v ${PWD}/data:/data flask-contactos windows + +--- + +Docker build (despues de contruir imagen con build, despues se puede quitar y usar solo image: nombreimagen) + +services: + +app: + +\- build: . + +\+ image: mi_app_python:1.0` + +--- + +#### Instalar docker + +Uninstall old versions +for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done +Set up Docker's apt repository. + +**Add Docker's official GPG key:** + +sudo apt-get update +sudo apt-get install ca-certificates curl +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +**Add the repository to Apt sources:** + +echo \ +"deb [arch=(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ +(. /etc/os-release && echo "{UBUNTU_CODENAME:-VERSION_CODENAME}") stable" | \ +sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update +Install the Docker packages. + +To install the latest version, run: + +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +Verify that the installation is successful by running the hello-world image: + +sudo docker run hello-world +This command downloads a test image and runs it in a container. When the container runs, it prints a confirmation message and exits. + +1. (Opcional) Evitar usar sudo con Docker Para no tener que escribir sudo cada vez, agrega tu usuario al grupo docker: sudo usermod -aG docker $USER newgrp docker # Recarga los grupos sin reiniciar sesión Ahora puedes probar sin sudo: docker run hello-world + +Para instalar además docker Desktop en Ubuntu Desktop: +1.sudo apt install gnome-terminal +2\. Descargar el paquete .deb de docker Desktop +3\. sudo apt-get update +sudo apt-get install ./docker-desktop-amd64.deb + +--- + +#### Docker Windows + +Habilitar wsl 2 + +Abrir PowerShell como Administrador + +wsl --install +Descargar/instalar docker Desktop +Configuración importante: +· ✅ Instalar componentes adicionales para WSL 2 +· ✅ Agregar acceso directo al escritorio +· ✅ Usar contenedores de Windows + +Abrir PowerShell o Command Prompt + +docker --version +docker-compose --version +docker run hello-world +wsl --list --verbose + +--- + +#### Copia base de datos mysql + +Copia seguridad base mysql (backup) +docker exec -it mysql-db mysqldump -u root -p testdb > backup.sql +mysql-db → es el nombre del contenedor (en tu docker-compose.yml). + +\-u root -p → usará la contraseña root que definiste. +testdb → es el nombre de la base de datos. + +> backup.sql → guarda la copia en tu máquina (no dentro del contenedor). +> 👉 Al ejecutarlo te pedirá la contraseña (root). + +Restaurar desde un backup (restore) +docker exec -i mysql-db mysql -u root -p testdb < backup.sql +Esto sobrescribirá la base de datos testdb con el contenido del backup. + +--- + +#### Puetos docker Ubuntu Server + +navidrome          4533 +kanboard         8081 - 443 +owncloud         8082 +owncloud-mariadb  3306 +owncloud-redis     6379 +jellyfin               8096 +transmission        9091 +portainer          9443 +plex             32400 \ No newline at end of file diff --git a/Guia_ghostscript.md b/Guia_ghostscript.md new file mode 100644 index 0000000..de714c2 --- /dev/null +++ b/Guia_ghostscript.md @@ -0,0 +1,110 @@ +GhostScript + +LINUX + +gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=salida.pdf entrada.pdf + + +WINDOWS + +CMD + +gswin64c -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=salida.pdf entrada.pdf + +POWERSHELL (comillas) + +gswin64c "-sDEVICE=pdfwrite" "-dCompatibilityLevel=1.4" "-dPDFSETTINGS=/ebook" "-dNOPAUSE" "-dQUIET" "-dBATCH" "-sOutputFile=output\_PRO.pdf" "progit.pdf" + +\--- + +Significado por partes: + +gs Ejecuta Ghostscript + +- sDEVICE=pdfwrite Establece que el dispositivo de salida es un archivo PDF +- dCompatibilityLevel=1.4 Define la compatibilidad del PDF de salida (1.4 es común) +- dPDFSETTINGS=/screen Controla la compresión y calidad (ver abajo) +- dNOPAUSE No hace pausa entre páginas +- dQUIET Oculta mensajes en consola +- dBATCH Ejecuta sin esperar interacción del usuario +- sOutputFile=salida.pdf Nombre del archivo de salida + +entrada.pdf Archivo de entrada + + +Opciones de compresión (PDFSETTINGS): + +Opción Compresión Calidad + +/screen Alta compresión Calidad baja (para visualizar en pantalla) + +/ebook Media Calidad aceptable para lectura + +/printer Baja Calidad buena para impresión + +/prepress Mínima compresión Alta calidad (prensa) + +\--- + +LINUX + +Simplificación como alias (temporal para tu sesión actual): + +alias comprimirpdf='gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH' + +Uso: + +comprimirpdf -sOutputFile=salida.pdf entrada.pdf + +O con script permanente (comprimir-pdf.sh): + +#!/bin/bash + +\# Uso: ./comprimir-pdf.sh entrada.pdf salida.pdf + +gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook \ + +- dNOPAUSE -dQUIET -dBATCH \ +- sOutputFile="$2" "$1" + +Dale permisos: + +chmod +x comprimir-pdf.sh + + + +WINDOWS + +comprimir-pdf-auto.bat + +@echo off + +:: Script para comprimir un PDF usando Ghostscript (Windows) + +:: Uso: arrastrar un solo archivo PDF sobre este script. + +:: Generará un nuevo archivo con \_compress.pdf al final. + +if "%~1"=="" ( + +echo Arrastra un archivo PDF sobre este script para comprimirlo. + +pause + +exit /b + +) + +set "input=%~1" + +set "output=%~dpn1\_compress.pdf" + +:: Ejecutar Ghostscript + +gswin64c "-sDEVICE=pdfwrite" "-dCompatibilityLevel=1.4" "-dPDFSETTINGS=/ebook" "-dNOPAUSE" "-dQUIET" "-dBATCH" "-sOutputFile=%output%" "%input%" + +echo PDF comprimido generado: %output% + +pause + + diff --git a/Guia_git.md b/Guia_git.md new file mode 100644 index 0000000..196f67a --- /dev/null +++ b/Guia_git.md @@ -0,0 +1,264 @@ +**AYUDA GIT** +========= + +**https://git-scm.com/** + +------------------- + +**CONFIGURAR GIT. CONFIGURACION LOCAL** + +git config --global user.name "Tu Nombre" +git config --global user.email "tuemail@example.com" +git config --global init.defaultBranch main Establecer main como rama por defecto en configuracion global +git config --global --list muestra datos configuracion global del repositorio +git config --list Muestra datos configuración global (usuario, email, etc.) +git config --global core.autocrlf true Uso en windows +git config --global core.autocrlf input Uso en Mac/Linux + +------------------- + +**CREAR REPOSITORIO EN GITHUB** +Inicia sesión en tu cuenta de GitHub. +Haz clic en el botón "New" en la esquina superior derecha. +Asigna un nombre a tu repositorio, elige la visibilidad (público o privado) y haz clic en "Create repository". +cd ruta/de/tu/carpeta +GitHub, por defecto, crea repositorios con la rama main + +------------------- + +**COMANDO GIT BASICOS** +git init Inicia un repositorio, crea una carpeta oculta .git donde Git almacenará los cambios. +git add . Agrega los archivos al área de preparación (staging): +git add nombre-del-archivo agregar uno específico +git commit -m "mensanje descriptivo" Guardar los cambios, registra los cambios en el historial de Git +git commit -am "mensaje" Agrega archivos modificados y hace el commit (no para archivos nuevos) +git add . && git commit -m "mensaje" Agrega archivo nuevos y hace commit + +git log Ver el Historial de Cambios, lista de commits +git log --oneline --graph --all resumen compacto +git reset nombre_archivo Deshacer los cambios, quitar archivos del area de preparacion. (antes de commit) +git checkout -- nombre_archivo + +git reset --soft HEAD~1 Deshacer el último commit +git reset --hard HEAD~1 Eliminar completamente el último commit +git rm archivo Eliminar del stage +git mv Cambiar nombre del stage + +.gitignore Ignorar archivos para seguimiento de Git + Crear archivo .gitignore / editar archivos a ignorar + git add .gitignore / git commit -m "commit git ignore" + +------------------- + +**PULL / PUSH** +git push -u origin main Subir los archivos a repositorio remoto (GitHub, gitlab, etc, confirmar que se esta en la rama en git) +git push -u origin master subir archivos si la rama local se llama master +git push -u origin master:main Sube a remoto a la rama main el repositorio local de rama master +git status status-s Ver el Estado del Repositorio / -s info resumida +git pull origin main --rebase Sincroniza el local con el remoto (cambios en remoto que no hay que perder) + +Sobreescribir repo remoto (el remoto tiene cambios que no me interesan y se pueden sobreescribir con la version de local) +git push --force origin main + +------------------- + +**REPOSITORIOS** + +git remote -v Ver el remoto actual +git remote set-url origin NUEVA_URL Cambiar el remoto +git remote remove origin Eliminar el remoto +git remote add origin NUEVA_URL Agregar un nuevo remoto + +git remote add origin https://github.com/tu-usuario/tu-repositorio.git Conectar el repositorio local con GitHub git remote add origin URL_DEL_REPO Añadir repositorio remoto (github, gitlab, etc...) +git pull origin main Obtener Cambios del Repositorio Remoto (actualizar el codigo) +git pull --rebase origin main Trae cambios (archivos) del remoto sin afectar al local. Despues add y commit. +git clone URL_DEL_REPO Clonar un Repositorio + +------------------- + +**RAMAS** + +git branch Ver las ramas esistentes +git branch -a Ver todas las ramas, incluyendo las remotas +git branch nueva-rama Crear una nueva rama (no te situa en la rama creada) +git checkout nueva-rama Cambiar a una rama +git switch nueva-rama Cambiar a una rama (nuevo sistema recomendado) +git checkout -b nueva-rama Crear rama y cambiar a ella automaticamente +git switch -c nueva-rama Crear rama e ir a ella, nuevo comando +git merge rama Fusionar rama, integrar cambios (previamente situarse en la rama main/master) +Si hay conflictos, Git te pedirá que los resuelvas manualmente antes de confirmar la fusión. +git branch -d nueva-rama Eliminar una rama local (usa -D si la rama no ha sido fusionada y quieres forzar su eliminación). +git push origin --delete rama Eliminar una rama remota: +git fetch Trae rama a tu repositorio local git checkout nombre-de-la-rama +git pull origin nombre-de-la-rama Trae rama a tu repositorio local con un solo comando +git branch -m master main cambiar nombre de rama (cambia nombre rama master a main, para GitHub) +git branch -d nombre-de-la-rama Eliminar una rama localmente +git branch -m master main Renombrar rama máster a main + +------------------- + +**Resumen** +Usa ramas para desarrollar nuevas funciones sin afectar main. +Cambia entre ramas con git switch o git checkout. +Fusiona cambios con git merge. +Borra ramas innecesarias con git branch -d. +Sube ramas con git push -u origin rama. + +------------------- + +**GITHUB TOKEN** +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 + +clonar un repositorio privado utilizando el toquen +git clone https://@github.com/codibytex/python_scripts.git + +ejemplo practico con el token generado: +git clone https://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@github.com/codibytex/python_scripts.git + +https://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@github.com/codibytex/detenpol.git + +echo "# fusionar_comprimir_pdf" >> README.md +git init +git add README.md +git commit -m "first commit" +git branch -M main +git remote add origin https://github.com/codibytex/fusionar_comprimir_pdf.git +git push -u origin main + + + +--- + +###### GITEA BACKUP + +###### **Gitea en docker** + +**backup** + +docker exec -it gitea bash + +gitea dump + +Esto generará un archivo tipo: + +`gitea-dump-YYYY-MM-DD.zip` + +Normalmente se guarda en: + +`/data` + +Copia el backup al host + +`docker cp gitea:/data/gitea-dump-YYYY-MM-DD.zip .` + + + +**Restore** + +1️⃣ Copia el dump al contenedor (si no está ya dentro) + +Si el ZIP está en el host: + +docker cp gitea-dump-YYYY-MM-DD.zip gitea:/data/ + +2️⃣ Detén el contenedor de Gitea + +docker stop gitea + +⚠️ Importante: no restaures con Gitea corriendo. + +3️⃣ Entra al contenedor + +docker exec -it gitea bash + +4️⃣ Ejecuta la restauración + +gitea restore --file /data/gitea-dump-YYYY-MM-DD.zip + +Esto: + +- Restaura repositorios + +- Restaura base de datos + +- Restaura configuración + +- Restaura issues, PRs, usuarios, etc. + +5️⃣ Sal y arranca el contenedor + +exit docker start gitea + + + +**Gitea en volumen docker.** + +Copiar directamente los volúmenes (rápida y eficaz) + +Si usas `docker-compose`, normalmente tienes algo así: + +`volumes: - ./gitea:/data` + +`docker compose down` + +tar czvf gitea_backup.tar.gz gitea/` + +`docker compose up -d` + + + +###### Copiar solo los repositorios (NO recomendado como único backup) + +Los repositorios están en: + +`/data/git/repositories` + +Puedes copiarlos así: + +`docker cp gitea:/data/git/repositories ./repos_backup` + +--- + + + +**Gitea snap** + +**backup** + +sudo gitea dump +Esto genera un archivo como: + +gitea-dump-YYYY-MM-DD.zip +Por defecto se guarda en: /var/snap/gitea/common + +**Restaurar** + +1️⃣ Detén Gitea: + +sudo snap stop gitea + +2️⃣ Restaura: + +sudo gitea restore --file gitea-dump-YYYY-MM-DD.zip + +3️⃣ Arranca Gitea: + +sudo snap start gitea + + + +Backup automático con cron (recomendado) Snap + +Ejemplo de **backup diario a las 2:00 AM**: + +`sudo crontab -e` + +Añade: + +`0 2 * * * gitea dump --file /var/backups/gitea/gitea-$(date +\%F).zip` + +(asegúrate de crear antes la carpeta `/var/backups/gitea`) + + + + diff --git a/Guia_lan.md b/Guia_lan.md new file mode 100644 index 0000000..ffd3859 --- /dev/null +++ b/Guia_lan.md @@ -0,0 +1,16 @@ +**dell windows** +ipconfig +192.168.18.120 + +**ubuntu server** +ip -a +192.168.18.235 + +**macos** +ipconfig getifaddr en0 +ifconfig +en0: inet +192.168.18.212 + +**asus bea** +192.168.18.174 \ No newline at end of file diff --git a/Guia_linux.md b/Guia_linux.md new file mode 100644 index 0000000..42b06a8 --- /dev/null +++ b/Guia_linux.md @@ -0,0 +1,941 @@ +# AYUDA LINUX + +**Navegación y Exploración** + +clear ctrl+l limpiar terminalpwd – Muestra el directorio actual (Print Working Directory).ls – Lista archivos y directorios. + +ls -R Lista filas y subdirectorios + +ls -l – Lista en formato largo (permisos, tamaño, fecha). + +ls -a – Muestra archivos ocultos (incluye . y ..). + +tree – Muestra la estructura de directorios en forma de árbol. + +ls | wc -l Cuenta filas/archivos y directorios + +ls -a | wc -l Cuenta tambien archivos ocultos + +ls -R | wc -l Cuenta files en directorio atual y subdirectorios + +ls \*.txt | wc -l Cuenta filas con determinada extension + +**Creación y Manipulación de Archivos** +touch – Crea un archivo vacío o actualiza su fecha de modificación. +Ejemplo: touch archivo.txt +mkdir – Crea un directorio. +Ejemplo: mkdir carpeta +cp – Copia archivos o directorios. +cp archivo.txt destino/ +cp -r directorio/ destino/ (copia recursiva para directorios). + +cp -r directorio/origen . (copia directorio origen al directorio donde estas situado usando con punto al final) +mv – Mueve o renombra archivos. +mv archivo.txt nuevo\_nombre.txt (renombra). +mv archivo.txt /ruta/destino/ (mueve). +rm – Elimina archivos. +rm archivo.txt +rm -r directorio/ (elimina recursivamente). +rm -f (fuerza eliminación sin confirmación). + +**Visualización de Archivos** +cat – Muestra el contenido de un archivo. +Ejemplo: cat archivo.txt +less / more – Muestra el contenido paginado (para archivos largos). +head – Muestra las primeras líneas (por defecto, 10). +head -n 5 archivo.txt (muestra 5 líneas). +tail – Muestra las últimas líneas. +tail -f archivo.log (sigue cambios en tiempo real, útil para logs). + +**Búsqueda de Archivos** +find – Busca archivos por nombre, tipo, tamaño, etc. +find /ruta -name "\*.txt" (busca archivos .txt). +find / -type f -size +10M (archivos >10MB). +grep – Busca texto dentro de archivos. +grep "palabra" archivo.txt +grep -r "texto" /directorio/ (búsqueda recursiva). + +**Buscar y borrar duplicados** + +sudo apt install fdupes +fdupes -r /ruta/de/la/carpeta        Buscar duplicados (sin borrar) +fdupes -rd \~/Documentos            Te pregunta cuáles borrar + +fdupes -rdN \~/Documentos        Borra todos menos uno + +**Permisos y Propiedad**chmod – Cambia permisos (lectura, escritura, ejecución).chmod 755 archivo.sh (permisos en formato numérico).chmod -R 777 db permisos a carpeta y contenidochmod +x script.sh (agrega permiso de ejecución). chown – Cambia el propietario de un archivo. chown usuario:grupo archivo.txt + +**Compresión y Descompresión** +tar – Empaqueta y descomprime archivos. +tar -cvf archivo.tar directorio/ (crea un .tar). +tar -xvf archivo.tar (extrae). +tar -czvf archivo.tar.gz directorio/ (comprime con gzip). +gzip / gunzip – Comprime/descomprime archivos .gz. +zip / unzip – Trabaja con archivos .zip. + +**Transferencia y Descarga** +wget – Descarga archivos desde la web. +Ejemplo: wget +curl – Transferencia de datos desde/hacia servidores. +Ejemplo: curl -O + +**Comparación de Archivos** diff – Compara dos archivos línea por línea. Ejemplo: diff archivo1.txt archivo2.txt + +**Enlace simbolico** + +Enlaces ln – Crea enlaces (links) entre archivos. + +ln -s /ruta/origen /ruta/enlace (enlace simbólico). + +**Puertos** + +Mostrar os puertos ocupados + +sudo ss -tulpn + +ejemplo resultado: + +Netid Local Address:Port Process +tcp 0.0.0.0:22 sshd +tcp 0.0.0.0:80 nginx +tcp 0.0.0.0:443 nginx + +**Buscar un puerto concreto**, por ejemplo el 8080: + +sudo ss -ltnp | grep :8080 + +**Ver qué proceso usa un puerto:​** + +sudo lsof -i :8080 + +sudo lsof -i :443 + +​ + +**Formatear discos** + +sudo fdisk /dev/sdX     Borrar el disco + +Dentro de `fdisk`: + +`g → GPT (recomendado) | n → nueva partición | w → guardar cambios` + +lsblk para comprobar + +sudo mkfs.ext4 /dev/sdX1 formatear particion en ext4 + +sudo mkfs.ext4 /dev/sdX formatear todo el disco en ext4 + +sudo mkfs.ext4 -L DATOS /dev/sdX1 formatear y asignar etiqueta + +(mejor usars particiones y no todo el disco) + +sudo e2label /dev/sdX1 DATOS asignar etiqueta + +​ + +sudo mkdir /mnt/datos    crear punto de montaje + +sudo mkdir /mnt/datos     montar el disco + +df -h     verificar + +​ + +Montaje automático de disco + +blkid /dev/sdX1    obtener UUID + +sudo nano /etc/fstab     editar fstab + +UUID=xxxx-xxxx /mnt/datos ext4 defaults 0 2 añadir linea para el disco + +​ + +Resumen rapido discos + +lsblk sudo umount /dev/sdX1 + +sudo mkfs.ext4 /dev/sdX1 + +sudo mount /dev/sdX1 /mnt/datos + +​ + +TERMINAL CTRL + ATL + T abrir terminal + +ctrl + l = clear limpiar terminal + +bash terminal normal + +zsh terminal zsh + +echo \$SHELL info shell activa chsh -s /bin/bash cambiar shell bash - cerrar sesion aplicar cambios chsh -s /bin/zsh cambiar shell zsh - cerrar sesion aplicar cambios + +​ + +**USUARIOS** - GRUPOS + +uname -a Datos instalacion linux + +whoami Usuario actual + +cut -d: -f1 /etc/passwd Ver usuarios del sistema sudo adduser nombre\_usuario Crear usuario sudo passwd nombre\_usuario Cambiar contraseña de usuario + +id nombre\_usuario Informacion de usuario su - nombre\_usuario Cambiar a otro usuario sudo su cambiar a root (superusuario) + +​ + +**HOSTS** + +/etc/hosts + +sudo nano /etc/hosts + +​ + +**PATH** + +Añadir al PATH + +nano \~/.bashrc     Ver/editar path usando bash nano + +\~/.zshrc                    Ver/editar path usando zshrc + +export PATH=PATH:/opt/lampp/bin + +Editar al final del archivo, ejemplo echo 'export LS\_COLORS="LS\_COLORS:di=36"' >> \~/.bashrc Escribir directamente en PATH source \~/.bashrc + +​ + +**PARAR/MATAR PROCESOS** + +ps aux Ver procesos + +ps aux | grep gunicorn Localizar un proceso + +kill \ Matar proceso + +kill -9 \ Forzar matar proceso + +sudo systemctl stop gunicorn Parar proceso iniciado como servicio systemd + + +**DIRECTORIOS Y ARCHIVOS** +ls listar directorio +ls -lah -l lista, -a ocultos, -h tamaño +ls -d \*/ mostrar solo directorios +ls -1 mostrar 1 columna +ls -lh -l lista, -h tamaño +Crear enlace simbólico/acceso directo: +ln -s /home/juan/Documentos/Proyectos \~/Escritorio/Proyectos + +du -h Lista directorios y subdirectorios - tamaño +du -sh \* Archivos y directorios - tamaño (ruta actual) +du -sh \*/ Directorios - tamaño (ruta actual) +du -sh /home Directorios home - tamaño +du -sh Tamaño total de la carpeta actual +du -sh \* | sort -hr Tamaño archivos/directorios ordenados + +crear alias tamaños archivos/directorios +alias size='du -sh \* 2>/dev/null | sort -hr' +source \~/.bashrc + +lsblk Listar discos y particiones +df -h Ver discos y tamaño +sudo fdisk -l Detalle de particiones +free -h Saber memoria total y disponible del equipo +uname -r kernel en uso +dpkg --list | grep linux-image lista de kernels instalador en sistema +sudo reboot Actualizar a ultimo kernel si esta instalado + +mkdir crear directorios rmdir o rm -d eliminar directorios vacíos. rm -r eliminar directorios no vacíos. mv nombreviejoarchivo1 nombrenuevoarchivo1 cambiar nombre de arhivos/directorios cat >> nombre\_del\_archivo.txt crear un archivo echo "Esto es un ejemplo" > nombre\_del\_archivo.txt crear un archivo + +​ + +**Montar/Desmontar USB** +sudo mkdir -p /mnt/mi\_usb # Cambia "mi\_usb" por el nombre que prefieras +sudo mount /dev/sdb1 /mnt/mi\_usb # Reemplaza "/dev/sdb1" con tu dispositivo +sudo mount -t ntfs-3g /dev/sdb1 /mnt/mi\_usb # Para NTFS +sudo mount -t vfat /dev/sdb1 /mnt/mi\_usb # Para FAT32 +sudo mount -o rw /dev/sdb1 /mnt/mi\_usb Si el dispositivo está en modo solo lectura, intenta montarlo con permisos de escritura +sudo apt install ntfs-3g Para dispositivos NTFS, ntfs-3g +sudo umount /dev/sdb1 +sudo umount /mnt/mi\_usb + +Montaje automático al recinicar (opcional) +sudo nano /etc/fstab +UUID=.... /mnt/mi\_usb ntfs-3g defaults 0 0 +UUID=.... /mnt/externo ext4 defaults,nofail 0 2 + +Para obtener el UUID del dispositivo, usa: sudo blkid sudo blkid /dev/sdb1 + +​ + +**Servicios** +sudo systemctl start nombre\_del\_servicio     Iniciar servicio +sudo systemctl stop nombre\_del\_servicio Detener servicio +sudo systemctl restart nombre\_del\_servicio Reiniciar servicio +sudo systemctl status nombre\_del\_servicio Estado servicio +sudo systemctl enable nombre\_del\_servicio Habilitar el servicio al inicio del sistema +sudo systemctl disable nombre\_del\_servicio Deshabilitar arranque automatico + +​ + +poweroff / sudo shutdown -h now Apagar +reboot / sudo shutdown -r now Reiniciar +systemctl suspend Suspender +ctrl + alt + sup cerrar sesion +gnome-session-quit --logout cerrar sesion terminal +alt + f2 ejecutar orden +alt + f4 cerrar ventana +super + h minimizar ventana +super + d mostrar escritorio +crtl + q cerrar ventana + +sudo apt update && sudo apt upgrade -y     Actualizar sistema + +lsb\_release -a Versión linux instalada +top Info procesos +htop Info procesos color + +**ABRIR EDITOR DE TEXTO GNOME, GEDIT, NANO (terminal)​** + +gnome-text-editor Abrir editor gnome + +gedit Abrir editor gedit (gedit prueba.txt) + +nano Abrir editor nano + +**BUSCAR ARCHIVOS** + +find /ruta/de/busqueda -name "archivo.ext" + +find / nombre\_archivo Busca en todo el sistema + +sudo find / -type f -name "nombre\_programa" 2>/dev/null Buscar en todo el sistema ignora permisos whereis nombre\_archivo locate nombrearchivo sudo apt install plocate sudo updatedb actualiza la base de datos para buscar grep -r "texto a buscar" /ruta Buscar el texto dentro de archivos which nombre\_programa Buscar si esta dentro del PATH + +**Clonar USB** + +lsblk o fdisk -l Identificar unidades usb + +sudo dd if=/dev/sdX of=/dev/sdY bs=4M status=progress     clonar directamente usb1 a usb2 + +sudo dd if=/dev/sdX of=backup\_usb.img bs=4M status=progress     clonar imagen sudo dd if=backup\_usb.img of=/dev/sdY bs=4M status=progress Restaurar imagen + +opcion2 (utilizar gnome disks) abre discos - seleccionar usb origen - menu (...) - crear imagen disco. guardar archivo .img Para restaurar usasr "restaurar imagen de disco" + +​ + +**Cambiar fecha/hora** + +sudo date --set="Sep 30 08:55:00 2025" + +​ + +**Instalar/Desinstalar paquete DEB desde la Terminal** + +sudo dpkg -i google-chrome-stable\_current\_amd64.deb dpkg --list ver lista de paquetes instalados sudo dpkg –remove teamviewer Desintalar paquete .deb sudo apt-get remove nombre\_del\_paquete Desinstalar paquete.deb + +**APT** +sudo apt install nombre\_paquete Instalar programa +sudo apt list muestra los paquetes instalados +apt search nombre\_paquete Buscar paquete apt +apt-cache search nombre\_paquete Buscar más específicamente +apt show nombre\_paquete Información del paquete +sudo apt remove nombre\_paquete Eliminar programa +sudo apt purge –auto-remove teamviewer Eliminar programa y dependencias +sudo apt-get autoclean Autolimpiar paquetes apt +sudo apt-get clean Eliminar cache +sudo apt-get autoremove Eliminar paquetes y dependencias que ya no hacen falta +apt-get download \ Descargar paquete apt +apt-cache depends \ Saber dependencias de un paquete / despues descargar +cada dependencias con apt-get download +sudo apt-get install -f resolver errores dependencias + +Descargar paquetes con apt-offline +sudo apt install apt-offline +Instalar en el equipo con conexion +apt-offline set --install-packages solicitud.sig +Generar solicitud descarga en equipo sin conexion apt-offline get solicitud.sig --bundle paquetes.zip Copia solicitud.sig en equipo conexion apt-offline install paquetes.zip Ejecutar en equipo sin conexion + +**INSTALAR PAQUETES SNAP** + +sudo snap install nombre-del-paquete +sudo snap install nombre-del-paquete --channel=versión # Instalar una versión específica +snap find término-de-búsqueda # Buscar paquetes disponibles +snap info nombre-del-paquete # Ver información detallada de un paquete +snap list # Listar todos los paquetes instalados +snap list --all # Ver paquetes instalados con más detalles +sudo snap remove nombre-del-pquete # Eliminar un paquete +sudo snap remove --purge nombre-del-paquete # Eliminar completamente (incluyendo datos) +sudo snap revert nombre-del-paquete # Revertir a versión anterior +sudo snap refresh nombre-del-paquete # Actualizar un paquete específico +sudo snap refresh # Actualizar todos los paquetes snap refresh --list # Ver actualizaciones disponibles + +**INSTALAR PAQUETES .AppImage** (autoejecutables) +Make it executable +chmod a+x Subsurface\*.AppImage +and run! +./Subsurface\*.AppImage + +**INSTALAR .XZ** +unxz edit-1.0.0-x86\_64-linux-gnu.xz Descomprimir, dejara archivo ejecutable +chmod +x edit-1.0.0-x86\_64-linux-gnu Hacer archivo ejecutable +sudo mv edit-1.0.0-x86\_64-linux-gnu /usr/local/bin/edit Opcional-Mover para usar en cualquier parte del sistema + +**INSTALAR tar.gz** +tar -xzf nombrearchivo.tar.gz --descomprimir el archivo + +ejecutar el script, normalmente bin/nombrescript.sh +Nota: NO SE DEBE extraer una nueva instancia sobre una ya existente. La carpeta de destino debe estar vacía. + +**ARCHIVOS COMPRIMIR/DESCOMPRIMIR RAR** +sudo apt update +sudo apt install unrar rar + +unrar x archivo.rar Descomprimir archivo +unrar e archivo.rar Descomprimir sin estructura carpetas +rar a nombre\_archivo.rar archivo1 archivo2 directorio/ Crear archivo rar +rar a backup.rar /ruta/al/archivo.txt /ruta/al/directorio +rar a -m5 archivo.rar directorio/ Maxima compresion +unrar l archivo.rar Listar contenido archivo rar +unrar x -pcontraseña archivo.rar Extraer archivo con contraseña + +**INSTALAR tar.xz DESDE LA TERMINAL** +tar -xf nombre\_del\_paquete.tar.xz +cd nombre\_del\_paquete +./configure +make +sudo make install + +##### Instalar ZIP + +Descomprimir: unzip nombrearchivo.zip +Cd a la carpeta descomprimida +./configure +make +sudo make install + +INSTALAR GESTOR PAQUETES SYNAPTIC +sudo apt install synaptic + +​ + +**INSTALAR CODECS MULTIMEDIA** + +sudo apt install Ubuntu-restricted-extras + +Instalar paquetes habituales en conjunto +sudo apt install idle python3-pip onedrive sqlite3 sqlitebrowser timeshift speedtest-cli gnome-shell-extension-manager neofetch +htop gdebi zsh nodejs npm filezilla apache2 mysql-client mysql-server php libapache2-mod-php php-mysql php-sqlite3 phpmyadmin + +sudo snap install bitwarden spotify gitea nextcloud mysql-workbench-community + +INSTALACION PROGRAMAS + +sudo snap install bitwarden Bitwarden (también .deb en web) + +sudo apt install wine Wine + +gnome contacts (centro aplicaciones) contacts + +wine /ruta/a/heidisql\_installer.exe Heidisql con wine + +OhMyZsh + +wget OhMyZsh sh -c "\$(wget -O- )" local-wp (descargar .deb/web) + +sudo apt install nextcloud-desktop Instalar cliente escritorio nextcloud ubuntu-desktop (diferente aplicacion snap) +Desinstalar libreoffice +sudo apt update +sudo apt remove --purge libreoffice\* +sudo apt clean +sudo apt-get autoremove + +##### INSTALAR/DESINSTALAR XAMPP + +xampp (descargar .run de web) XAMPP +sudo chmod +x xampp-linux-x64-*-installer.run +sudo ./xampp-linux-x64-​*-installer.run +Desinstalar Xampp +sudo /opt/lampp/lampp stop +sudo rm -rf /opt/lampp +sudo rm -f /usr/share/applications/xampp-control-panel.desktop + +##### INSTALAR LAMP + +sudo apt update && sudo apt upgrade +sudo apt install apache2 +sudo apt install mysql-server +sudo mysql\_secure\_installation +sudo apt install php libapache2-mod-php php-mysql php-sqlite3 +echo "" | sudo tee /var/www/html/info.php +sudo rm /var/www/html/info.php +sudo systemctl restart apache2 +sudo apt install phpmyadmin +seleccionar apache - aceptar dbconfig-common +sudo snap install mysql-workbench-community +Crear usuario phpmyadmin para acceder: +sudo mysql Entrar mysql +CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'clave\_segura'; +GRANT ALL PRIVILEGES ON *.​* TO 'usuario'@'localhost' WITH GRANT OPTION; +GRANT ALL PRIVILEGES ON nombre\_basedatos.\* TO 'usuario'@'localhost'; # Acceso a una sola base datos +FLUSH PRIVILEGES; Aplicar canbios +EXIT; + Iniciar sesion en phpmyadmin + +Eliminar usuario +DROP USER 'nombre\_usuario'@'host'; +FLUSH PRIVILEGES; + +UBUNTU DESKTOP ACCESOS mysql root (no tiene contraseña) 123Passowrd! Contraseña de phpmyadmin para mysql (ojo se puso mal pero es 123Passowrd! admin - 123Password! Phpmyadmin usuario + +​ + +**ACTUALIZAR DISTRO UBUNTU DESDE TERMINAL** +sudo apt update && sudo apt upgrade && sudo apt dist-upgrade +sudo do-release-upgrade + +**PAPELEREA EN ESCRITORIO** + +gsettings set org.gnome.shell.extensions.ding show-trash true gsettings set org.gnome.shell.extensions.ding show-trash false + +**LIMPIAR EL SISTEMA** + +sudo apt autoclean + +sudo apt autoremove + +sudo apt clean + +**GRUB (cambiar orden)​** +sudo gedit /etc/default/grub GRUB DEFAULT= y un número que empieza en cero, equivalente al sistema operativo que arrancará en primer lugar por defecto. +sudo update-grub -actualizar cambios + +**CREAR LANZADOR PYTHON** + +1. Abre una terminal y navega a tu directorio personal: cd \~ + +2. Crea un nuevo archivo `.desktop` en la carpeta de aplicaciones locales: nano \~/.local/share/applications/python3.desktop + +3. En ese archivo, pega el siguiente contenido: \[Desktop Entry] Version=1.0 Name=Python3 Script Launcher Exec=/usr/bin/python3 %f Icon=utilities-terminal Terminal=true Type=Application MimeType=text/x-python; + +4. Guarda y cierra el archivo con `CTRL + O`, luego `ENTER`, y finalmente `CTRL + X`. + +5. Actualiza las asociaciones MIME. Para que el sistema reconozca los cambios, actualiza la base de datos de MIME: update-desktop-database \~/.local/share/applications + +6. Selecciona Python3 como aplicación predeterminada + +PIP UBUNTU 24 +Atención instalar complementos pip en ubuntu 24.04: + +1. Permitir instalar con PIP normal: Eliminar el archivo que indica cambio de criterio cd /usr/lib/python3.11 sudo rm EXTERNALLY-MANAGED Restaurar: sudo touch EXTERNALLY-MANAGED + +ERRORES PYTHON CON IMAGENES PIL - PILLOW + +sudo apt-get install python3-pil python3-pil.imagetk + +**CREAR UN ACCESO DIRECTO:​** +Si el programa es una aplicación gráfica y quieres ejecutarlo desde el menú de aplicaciones, puedes crear un archivo .desktop en \~/.local/share/applications/. +Ejemplo de archivo .desktop: + +\[Desktop Entry] +Name=Nombre del Programa +Exec=/ruta/al/directorio/nombre\_del\_programa +Icon=/ruta/al/icono.png +Type=Application +Categories=Utility;Application; + +Guarda con la extensión .desktop y hacer ejecutable: +chmod +x \~/.local/share/applications/nombre\_del\_programa.desktop (hacer ejecutable) + +**COPIAR ACCESO A APLICACIONES EN ESCRITORIO** + +Los accesos directos estan en /usr/share/applications/ hace falta copiar y pegar en carpeta Escritorio + +**XAMPP** +sudo /opt/lampp/lampp start Iniciar Xampp +sudo /opt/lampp/lampp stop Detener Xampp +Panel de control lamp sudo /opt/lampp/manager-linux-x64.run +Php.ini ubicacion /opt/lampp/etc + +Elige la arquitectura para tu Linux OS, versión de 32-bits o de 64-bits. + +1. Cambia los permisos al instalador chmod 755 xampp-linux-\*-installer.run + +2. Ejecuta el instalador sudo ./xampp-linux-\*-installer.run directorio /opt/lampp. + +SQLITE En aplicaciones con Sqlite3 la carpeta donde está la base de datos tiene que tener permisos de lectura y escritura porque si no da error en las updates-delete,etc.. En cambio, sí que lee la base de datos + +**PERMISOS** +Qué son los permisos en Linux? +Cada archivo o carpeta tiene tres tipos de permisos para tres tipos de usuarios. +Tipos de usuarios: +Propietario (owner) – quien creó el archivo. +Grupo – otros usuarios del mismo grupo. +Otros (others) – todos los demás. +Tipos de permisos: +r = lectura (read) → ver contenido. +w = escritura (write) → modificar o eliminar. +x = ejecución (execute) → ejecutar como programa/script. +Representación numérica: +Cada permiso tiene un valor: +r = 4 +w = 2 +x = 1 +Se suman por grupo. Ejemplo: +Permisos Valor +rwx 7 (4+2+1) +r-x 5 (4+0+1) +rw- 6 (4+2) +r-- 4 +Entonces: +chmod 755 archivo +Significa: +7 (rwx) → dueño: todo permitido +5 (r-x) → grupo: leer y ejecutar +5 (r-x) → otros: leer y ejecutar +Comandos comunes: +chmod → cambia permisos +chown → cambia el propietario +ls -l → muestra los permisos de archivos +Supongamos que tienes esto: +mkdir proyecto +cd proyecto +touch script.sh +Paso 1: Ver los permisos actuales +ls -l +Salida típica: +-rw-r--r-- 1 usuario usuario 0 abr 29 12:00 script.sh +Esto significa: +-rw-r--r-- = el propietario puede leer y escribir, los demás solo leer. +No tiene permiso de ejecución (x), por eso no puedes correrlo como programa. +Paso 2: Dar permisos de ejecución al archivo +chmod +x script.sh +Ahora, ls -l muestra: +-rwxr-xr-x 1 usuario usuario 0 abr 29 12:00 script.sh +Ya puedes ejecutarlo: +./script.sh +Paso 3: Dar permisos de escritura a una carpeta (para copiar, crear o modificar dentro) +chmod 775 proyecto +Esto significa: +Dueño y grupo pueden leer, escribir y entrar (rwx). +Otros pueden leer y entrar, pero no escribir (r-x). + +Paso 4: Hacer que Apache (u otro usuario) pueda escribir ahí +Si estás en un servidor web: +sudo chown -R www-data:www-data proyecto +sudo chmod -R 775 proyecto + +chmod +x archivo.sh # hacer que un archivo sea ejecutable. +chmod 777 archivo.txt o ruta (Todos los permisos para todos) +sudo mkdir -m 777 /home/carpeta\_nueva crea una carpeta con permisos +chmod 755 script.sh Significa:7 (rwx) → El propietario puede leer, escribir y ejecutar. 5 (r-x) → El grupo y otros pueden leer y ejecutar, pero no modificar. +chmod 644 documento.txt Significa: 6 (rw-) → El propietario puede leer y escribir. 4 (r--) → El grupo y otros solo pueden leer. +chmod -R 755 /ruta/de/la/carpeta chmod -R (Aplicar permisos de forma recursiva) + +Permisos de grupo a varios usuarios +sudo groupadd media # crear grupo +sudo usermod -aG media jesus # añadir usuario al grupo +sudo usermod -aG media transmission-daemon # añadir usuario al grupo +sudo chgrp media /mnt/Toshiba # cambiar el grupo de la carpeta +sudo chmod g+rw /mnt/Toshiba # Dar permisos de lectura y escritura al grupo: +newgrp media # Aplicar cambios (reinicia sesión o ejecuta): + +Permisos con setfacl + +sudo apt update && sudo apt install acl -y sudo setfacl -m u:jesus:rwx /mnt/Toshiba #asigna permisos de lectura y escritura -m: Modifica los permisos ACL. u:jesus:rwx: Da permisos de lectura (r), escritura (w) y ejecución (x) al usuario jesus. sudo setfacl -Rm u:jesus:rwx /mnt/Toshiba sudo setfacl -dm u:jesus:rwx /mnt/Toshiba -R: Aplica recursivamente en los archivos existentes. -d: Establece permisos por defecto para nuevos archivos. getfacl /mnt/Toshiba + +CREAR ACCESOS DIRECTOS enlace simbolico ln -s /home/jesus/Documentos /home/jesus/Escritorio #este ejemplo crea acceso directo a documentos en escritorio ln -s /path destino /path colocacion acceso directo /home/jesus/Documentos + +CARPETA FONDOS DE ESCRITO /usr/share/backgrounds + +EXTENSIONES Blur my shell Add to desktop Dash to dock Caffeine Coverflow Alt-Tab ArcMenu Vitals Custom Hot Corners – Extended Places status indicator Apps menu Bluetooth Quick connect Services Systemd show desktop applet + +VELOCIDAD INTERNET desde terminal (speedtest) speedtest speedtest-cli // speedtest --simple + +JUEGOS LINUX frozen bubble Cannonball Supertuxkart Supertux Killbots Kapman Quadrapassel Trackmania Nations Forever Chess gnome kobodeluxe (apt) open-invaders (apt) astromenace (apt) chromium-bsu (sudo apt) + +WINE wine aplicacion.exe #ejecutar una aplicacion .exe + +PDF HERRAMIENTAS sudo apt install pdfarranger pdfarranger sudo dpkg -i pdfsam\_\*.deb pdfSam Basic (descargar del sitio web) sudo apt install ghostscript ghostscript (comprimir pdf) gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=salida.pdf entrada.pdf Puedes cambiar /screen por /ebook, /printer o /prepress según el nivel de calidad/ tamaño. + +INSTALAR GNOME + +Para instalar GNOME con la menor cantidad de utilidades de GNOME, tendrías que instalar un paquete llamado vanilla-GNOME usando el comando dado: sudo apt install vanilla-gnome-desktop Y si quieres tener una experiencia GNOME completa, puede simplemente instalar el gnome paquete: sudo apt install gnome desintalar gnome ubuntu sudo apt-get remove --auto-remove gnome-shell sudo apt-get purge --auto-remove gnome-shell + +ENTORNOS DE ESCRITORIO + +Sudo apt-get install Ubuntu-mate-desktop Sudo apt-get install cinnamon-desktop-environment Sudo apt-get install kde-standard + +REINICIAR EL DOCK + +dconf reset -f /org/gnome/shell/extensions/dash-to-dock/ dconf reset -f /org/gnome/shell/extensions/favorite-apps + +DOCK UBUNTU MINIMIZAR APLICACIÓN + +gsettings set org.gnome.shell.extensions.dash-to-dock click-action 'minimize' gsettings reset org.gnome.shell.extensions.dash-to-dock click-action #quitar gsettings range org.gnome.shell.extensions.dash-to-dock click-action #opciones + +REINICIAR UBUNTU POR DEFECTO (DOCK, FONDOS, ETC... como recien instalado) dconf reset -f / + +**ACTUALIZAR LA APP UBUNTU STORE** + +snap refresh snap-store --channel=latest/stable/ubuntu-24.04 This command may fail and output something look like: snap ‘snap-store’ has running apps, pids: 2205. In the case, just kill snap-store using the ID number (replace 2205 to yours): Sudo kill –9 2205 (o el numero que salga) Then, re-run the snap refresh command. + +DOCK TRANSPARENTE +gsettings set org.gnome.shell.extensions.dash-to-dock transparency-mode 'FIXED' +gsettings set org.gnome.shell.extensions.dash-to-dock background-opacity 0.2 +Change 0.0 to any number between 0 and 1. +To reset to the default setting: +gsettings reset org.gnome.shell.extensions.dash-to-dock background-opacity + +MAME Ruta: /usr/share/games + +CONFIGURAR TECLADO +KALI LINUX +Poner idioma español +sudo dpkg-reconfigure localeses\_ES.UTF-8 UTF-8 +reiniciar + +Unbuntu, etc. sudo dpkg-reconfigure keyboard-configuration Desde Ajustes – Teclado y poner español + +Cambiar permisos desde la consola +Nos vamos a Aplicaciones -> Accesorios -> Terminal +Por ejemplo yo le quiero dar permisos de lectura, escritura y ejecución para los 3 grupos a una carpeta llamada Prueba que está en el Escritorio, así que navego hasta el escritorio: +cd Escritorio + +Y tengo dos opciones,la numérica y la alfabética: +1.- chmod 777 Prueba +2.- chmod rwx Prueba + +Si la carpeta pertenece a root, tendremos que hacerlo asi: +1.- sudo chmod 777 Prueba +2.- sudo chmod rwx Prueba + +Si queremos que se haga de manera recursiva, es decir, que los ficheros y carpetas contenidos en Prueba, también reciban estos cambios, hacemos esto: +1.- chmod -R 777 Prueba +2.- chmod -R rwx Prueba + +Cualquiera de las dos y teniendo en cuenta lo de sudo. +Un par de ejemplos más: +Queremos que el usuario tenga RWX, el grupo RW y los demás R, en la carpeta Prueba: +1.- chmod 764 Prueba +2.- chmod u=rwx,g=rw,o=r Prueba +u equivale a usuario (user) g a grupo (group) y o a otros (others). También sirve lo de -R y sudo. +Queremos que el usuario tenga RW, el grupo R y los demás R, en la carpeta Prueba: +1.- chmod 644 Prueba +2.- chmod u=rw go=rw Prueba +Igualmente sirve lo de -R y sudo. +Para quitar permisos, realmente es cambiarlos por otros, asi que es lo mismo que aquí se explica. + +SOLUCION FALTA DE SONIDO ubuntu (no reconoce audio) +sudo apt-get install --reinstall alsa-base pulseaudio +sudo alsa force-reload + +SOLUCION ERROR PYTHON PYSIDE6 +sudo apt install libxcb-cursor0 libxcb-xinerama0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 + +AÑADIR PROGRAMA/CARPETA AL PATH +nano \~/.bashrc - nano \~/.zshrc +export PATH=PATH:HOME/ruta/al/directorio - Guardar y cerrar. +Ejemplo - export PATH=PATH:HOME/python/venv/lib/python3.12/site-packages/PySide6\`\` + +source \~/.bashrc - Actualizar +Verificar path +echo \$PATH + +**GITEA** +Gitea (arrancar y parar) Instalado desde snap +localhost:3000 (puerto 3000) +Iniciar Gitea sudo snap start gitea +Detener Gitea sudo snap stop gitea +Verificar estado sudo snap services gitea +Deshabilitar inicio sudo snap disable gitea +Reiniciar Gitea sudo snap restart gitea +Eliminar Gitea sudo snap remove gitea + +**LOCAL-WP (solucion problema)​** +Local-wp ubuntu 24.04 (solucionar problemas de instalación con dependencias) +curl -O +sudo dpkg -i libtinfo5\_6.4-2\_amd64.deb +curl -O +sudo dpkg -i libncurses5\_6.4-2\_amd64.deb +curl -O +sudo dpkg -i libaio1\_0.3.113-4\_amd64.deb + +sudo apt install ./local-9.1.1-linux.deb (o bien) +sudo dpkg -i local-9.1\*.deb + +resolver error: sudo apt install libxapp-gtk3-module sudo apt install libxapp-gtk3-module + +**DOCKER** + +Para instalar Docker en Ubuntu, sigue estos pasos: + +1. Eliminar versiones antiguas (si existen) sudo apt remove docker docker-engine docker.io containerd runc + +2. Instalar dependencias necesarias sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common + +3. Agregar el repositorio oficial de Docker curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb \[arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \$(lsb\_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +4. Instalar Docker Engine sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io + +5. Verificar que Docker esté funcionando sudo systemctl status docker (Deberías ver active (running)). Para probarlo, ejecuta: sudo docker run hello-world (Si funciona, verás un mensaje de confirmación). + +6. (Opcional) Evitar usar sudo con Docker Para no tener que escribir sudo cada vez, agrega tu usuario al grupo docker: sudo usermod -aG docker \$USER newgrp docker # Recarga los grupos sin reiniciar sesión Ahora puedes probar sin sudo: docker run hello-world + +docker ps # Ver contenedores en ejecución docker stop mi-web # Detener el contenedor docker start mi-web # Iniciar el contenedor nuevamente docker rm mi-web # Eliminar el contenedor (cuando ya no lo necesites) + +**ARREGLAR GRUB** + +Confirmar si se usa UEFI y ver archivo .efi +ls -l /boot/efi/EFI/ubuntu/ + +Verificar modo de arranque +\[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS" + +Archivo BIOS para grub - uefi. +/boot/efi/EFI/ubuntu/grubx64.efi - Sin secure boot +/boot/efi/EFI/ubuntu/shimx64.efi - Con secure boot + +Reinstalar grub EN UEFI +sudo grub-install --target=x86\_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu + +Reparar el arranque UEFI +sudo mount /dev/sdXY /mnt # Reemplaza sdXY con tu partición raíz (ej: sda2)sudo mount /dev/sdXZ /mnt/boot/efi # Reemplaza sdXZ con tu partición EFI (ej: sda1)sudo grub-install --efi-directory=/mnt/boot/efisudo update-grubsudo update-grub + +sudo fdisk -l -para identificar particion y la de linux/ubuntu + +sudo mount /dev/nvme0n1p6 /mnt --Particion linux +sudo mount /dev/nvme0n1p1 /mnt/boot/efi --Particion efi +sudo mount --rbind /dev /mnt/dev +sudo mount --rbind /proc /mnt/proc +sudo mount --rbind /sys /mnt/sys +sudo chroot /mnt --Entrar como root +grub-install /dev/nvme0n1 --Instala grub en efi +update-grub +exit +sudo reboot + +script automatico +\#!/bin/bash + +echo "📦 Montando particiones..." +sudo mount /dev/nvme0n1p6 /mnt +sudo mount /dev/nvme0n1p1 /mnt/boot/efi +sudo mount --bind /dev /mnt/dev +sudo mount --bind /proc /mnt/proc +sudo mount --bind /sys /mnt/sys + +echo "🔧 Entrando a chroot para instalar GRUB..." +sudo chroot /mnt /bin/bash -c " +grub-install /dev/nvme0n1 && +update-grub && +echo '✅ GRUB instalado correctamente dentro de chroot' +" + +echo "🚀 Reparación completa. Puedes reiniciar ahora." + +nano reparar-grub.sh +chmod +x reparar-grub.sh +sudo ./reparar-grub.sh + +Saber si se esta en UEFI o Legacy BIOS +ls /sys/firmware/efi - Si hay contenido esta en UEFI +\[ -d /sys/firmware/efi ] && echo "Estás en modo UEFI" || echo "Modo legacy bios" + +Añadir windows a Grub si ha desaparecido +Actualiza GRUB con detección de otros sistemas operativos: +sudo apt install os-prober +sudo update-grub +Esto ejecutará os-prober, que buscará otros sistemas instalados, como Windows, y regenerará el menú de GRUB. +⚠️ Si Windows no aparece aún, puede que os-prober esté deshabilitado (desde Ubuntu 22.04): +Edita el archivo de configuración de GRUB: +sudo nano /etc/default/grub +GRUB\_DISABLE\_OS\_PROBER=false +sudo update-grub +sudo reboot + +​ + +**CRON** + +systemctl status cron Estado servicio cron +crontab -e Tabla de cron propio de cada usuario + +crontab -u www-data -e cron del usuario www-data + +sudo crontab -e Cron de sudo + +crontab -l Lista las tareas cron +grep CRON /var/log/syslog Logs cron + +###### Sintaxis de una regla en `cron` + +Cada línea en `crontab` sigue este formato: + +* comando\_a\_ejecutar │ │ │ │ │ │ │ │ │ └── Día de la semana (0-6, donde 0 = domingo) │ │ │ └──── Mes (1-12) │ │ └────── Día del mes (1-31) │ └──────── Hora (0-23) └────────── Minuto (0-59) + +* Ejecutar un script cada día a las 2:30 AM 30 2 \* \* \* /ruta/al/script.sh + +* Ejecutar cada 5 minutos: \*/5 \* \* \* \* /ruta/al/script.sh + +* Ejecutar todos los lunes a las 8:00 AM: 0 8 \* \* 1 /ruta/al/script.sh + +###### + +minuto hora día\_mes mes día\_semana + +###### Ubicación de los crontabs + +1. **Usuario actual:​** `crontab -e` → se guarda en `/var/spool/cron/crontabs/usuario` + +2. **Global (para todos los usuarios):​** + + * `/etc/crontab` + + * Archivos en `/etc/cron.d/` + + * Directorios especiales: + + * `/etc/cron.daily/` (se ejecuta una vez al día) + + * `/etc/cron.hourly/` (cada hora) + + * `/etc/cron.weekly/` (una vez a la semana) + + * `/etc/cron.monthly/` (una vez al mes) + +#### GENERAR TOKENS + +**Linux / macOS** +OpenSSL +openssl rand -hex 32 + +Genera 32 bytes aleatorios en hexadecimal (64 caracteres). + +/dev/urandom +cat /dev/urandom | tr -dc 'a-f0-9' | head -c 64 +echo +UUID +uuidgen +Ejemplo: +550e8400-e29b-41d4-a716-446655440000 + +**Windows** +PowerShell +\[guid]::NewGuid() + +O un token más largo: +-join ((48..57) + (97..102) | Get-Random -Count 64 | % {\[char]$\_}) +OpenSSL en Windows + +Si tienes instalado OpenSSL +openssl rand -hex 32 + +**Python (multiplataforma)​** +Funciona igual en Linux, macOS y Windows: +import secrets +token = secrets.token\_hex(32) +print(token) diff --git a/Guia_macos.md b/Guia_macos.md new file mode 100644 index 0000000..0cf7bd1 --- /dev/null +++ b/Guia_macos.md @@ -0,0 +1,108 @@ +Atajos de teclado F11 → Muestra el escritorio (en muchos teclados tendrás que usar Fn + F11). + +Command (⌘) + F3 → También muestra el escritorio. Fn + F11 → En MacBooks más nuevos, hace lo mismo.Gestos en el trackpad. + +F4. Muestra launchpad. + +Pellizcar con cuatro dedos hacia afuera → Muestra el escritorio. +Deslizar con tres/four dedos hacia arriba → Activa Mission Control (puedes ver todas las ventanas abiertas). + +Desde la barra superior +Clic en el Centro de control (esquina superior derecha) → “Mission Control” → “Mostrar Escritorio”. + +Renombrar archivo. +Simplemente pulsar Enter sobre archivo seleccionado (no F2) + +📁 Copiar, pegar y mover +⌘ + C → Copiar archivo/carpeta seleccionada +⌘ + V → Pegar (copia el archivo) +⌘ + ⌥ + V → Mover archivo (pegar en nueva ubicación) +⌘ + D → Duplicar archivo/carpeta seleccionada +🔎 Navegación rápida +⌘ + ↑ → Ir a la carpeta contenedora (subir un nivel) +⌘ + ↓ → Abrir archivo/carpeta seleccionada +⌘ + ⌫ → Enviar archivo/carpeta seleccionada a la papelera +⇧ + ⌘ + ⌫ → Vaciar papelera +🔄 Selección +⌘ + A → Seleccionar todo +⌘ + clic → Selección múltiple no contigua +⇧ + clic → Selección de rango +🔍 Búsqueda y vist +⌘ + F → Buscar en la carpeta actual +⌘ + 1 → Vista como iconos +⌘ + 2 → Vista como lista +⌘ + 3 → Vista como columnas +⌘ + 4 → Vista como galería +🖥️ Atajos útiles para escritorio +F11 o ⌘ + F3 → Mostrar escritorio +⌘ + Tab → Cambiar entre aplicaciones abiertas +⌘ + H → Ocultar ventana activa +⌘ + ⌥ + H → Ocultar todas menos la activa + +Atl-Gr equivale a tecla ⌥ (Option/Alt). +~ ⌥ (Option) + ñ + +**Finder/terminal** +open . Abrir el finder desde la terminal +open /ruta/a/la/carpeta abrir otra ruta específica +open -R archivo.ext abrir la carpeta que contiene un archivo + +**Alinear ventanas** +fn + control + flecha izq/der/up/down # situa ventana izq/der/up/down + +**alias** +alias nombre_alias="comando -opciones" Crear alias +alias ll="ls -la" +unalias nombre_alias Eliminar alias sesion actual +alias Ver alias + +Alias permanente +nano ~/.zshrc +alias ll="ls -la" +alias ls='ls -G' poner color a carpetas en terminal +source ~/.zshrc + +Linux +nano ~/.bashrc +alias ll="ls -la" +source ~/.bashrc + +Windows +Set-Alias ll Get-ChildItem. alias temporal +Alias permanenete +notepad $PROFILE +\# Alias simple +Set-Alias ll Get-ChildItem +\# Función personalizada +function gs { git status } +function gc { git commit -m $args } +function gp { git push } + +Editar hosts +nano /etc/hosts + +windows - C:\\Windows\\System32\\drivers\\etc\\hosts + +**Evitar arranque automatico** +sudo nvram BootPreference=%00 - no iniciar al abrir tapa o conectar corriente +sudo nvram BootPreference=%01 - evitar arranque al abrir la tapa +sudo nvram BootPreference=%02 - evitar arranque al conectar corriente +sudo nvram -d BootPreference - volver a habilitar por defecto + +Homebrew instalar + +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + +Minimizar ventana al pulsar app del dock +activar +defaults write com.apple.dock minimize-to-application -bool true; killall Dock +desactivar +defaults delete com.apple.dock minimize-to-application; killall Dock + +Cambiar nombre a Archivo +Seleccionar archivo + Tecla Enter/Retur = F2 en windows/linux + +Saber IP +curl ifconfig.me ip pública +ipconfig getifaddr en0 (o en1 para Ethernet) ip privada + diff --git a/Guia_mysql.md b/Guia_mysql.md new file mode 100644 index 0000000..8d95bcd --- /dev/null +++ b/Guia_mysql.md @@ -0,0 +1,560 @@ +AYUDA MYSQL + +\=========== + + +Acceso consola de mysql/mariadb + +./mysql u- root (si no tiene password) + +./mysql u- root -p + + + +Backups mysqldump desde terminal + +./mysqldump -u root -p nombre\_base\_datos > backup.sql + +./mysqldump -u root -p --all-databases > all\_databases\_backup.sql + +mysqldump -h localhost -u root -p --port=3307 mi\_base > backup.sql Para establecer puerto 3307 + +Restaurar un backup mysql/mariadb + +Terminal del sistema operativo + +mysql -u root -p nombre\_base\_datos < backup.sql + +mysql -h localhost -u usuario -p --port=3307 nombre\_base < backup.sql Estableciendo puerto + +Consola mysql/mariadb + +show databases; Mostrar bases de datos + +use database\_name; Seleccionar base de datos + +drop database database\_name Borrar base de datos + +create database database\_name Crear base de datos + +DROP USER 'juan'@'localhost'; Borrar usuario + +DROP USER 'juan'@'%'; Si el usuario se conecta desde cualquier host (%): + +SELECT user, host FROM mysql.user; Ver usuarios + + +Modificar tablas a InnoDb + +SELECT CONCAT('ALTER TABLE ', table\_name, ' ENGINE=InnoDB;') + +FROM information\_schema.tables + +WHERE table\_schema = 'nombre\_base\_datos' AND engine = 'MyISAM'; + +Luego ejecutas las sentencias generadas. + +ALTER TABLE tabasunto ENGINE=InnoDB; + +ALTER TABLE tabmodus ENGINE=InnoDB; + +ALTER TABLE tabobjetos ENGINE=InnoDB; + +ALTER TABLE taboficios ENGINE=InnoDB; + +ALTER TABLE tabdetenpol ENGINE=InnoDB; + +ALTER TABLE tabusers ENGINE=InnoDB; + +ALTER TABLE tabregistro ENGINE=InnoDB; + + +Usar mysqldump en linux con Xampp + +/opt/lampp/bin/mysqldump -u [usuario] -p [nombre\_base\_de\_datos] > [archivo\_salida.sql] + +gzip ~/copia\_seguridad\_mi\_basedatos.sql Comprimir la copia de seguridad + +export PATH=/opt/lampp/bin:$PATH Activar mysqldump en el PATH + +mysqldump -u root -p mi\_basedatos > ~/copia\_seguridad.sql + +PhpMyAdmin + +Aumentar liminte de carga. Editar php.ini (/etc/php/ c:\xampp\php) + +modificar los valores: + +upload\_max\_filesize = 2000M + +post\_max\_size = 2000M + +max\_execution\_time = 300 + +max\_input\_time = 300 + +Reiniciar apache + +sudo systemctl restart apache2 Linux + +Poner en mayusculas / minusculas + +UPDATE productos SET categoria = UPPER(categoria); (actualizar) + +SELECT id, UPPER(nombre) AS nombre\_mayusculas FROM categorias; (solo visualizar) + +UPDATE tabla SET columna = LOWER(columna); + +UPDATE tabla SET columna = CONCAT( + +UPPER(SUBSTRING(columna, 1, 1)), -- Primera letra en mayúscula + +LOWER(SUBSTRING(columna, 2)) -- Resto en minúsculas + +SELECT nombre, CONCAT(UPPER(SUBSTRING(nombre, 1, 1)), LOWER(SUBSTRING(nombre, 2))) AS nombre\_formateado + +FROM categorias; (solo visualizacion select) + +Guardar datos de una tabla a otra de la misma base de datos. + +INSERT INTO tabla1 (apellido, nombre, sexo) SELECT apellido, nombre, sexo FROM tabla2; + + +Guardar datos de una tabla a otra de la misma base de datos. + +INSERT INTO tabla1 (apellido, nombre, sexo) SELECT apellido, nombre, sexo FROM tabla2; + +Guardar datos de una tabla a otra en diferente base de datos. + +INSERT INTO db1.tabla (rut, apellido, nombre, sexo) SELECT rut, apellido, nombre, sexo FROM dbo2.tabla; + +Insert into db1.tabla select \* from db2.tabla; (ambas tablas tienen que tener la misma estructura). + +Actualizar datos tabla + +UPDATE tabla\_nombre SET column1 = value1, column2 = value2 … WHERE condicion; + +UPDATE tabla\_nombre SET column1 = value1, column2 = value2 … WHERE condicion LIKE ‘%hola%’; + +Insertar datos en campo/s desde otra tabla + +INSERT INTO tabDestino (column1, column2) SELECT columnX, columnY FROM tabOrigen; + + +SELECT + +SELECT \* FROM tabregistro WHERE registro NOT LIKE '%/%' AND fechaent BETWEEN '2020-01-01' and '2020-12-31' + +SELECT \* FROM tabregistro WHERE fechaent BETWEEN '2020-01-01' AND '2020-12-31' + +UPDATE + +UPDATE oeste\_oficios SET grupo = 'oeste'; + +UPDATE tabregistro SET procedencia = 'ODAC Central' WHERE procedencia = 'I.C.G.'; UPDATE centro\_detenpol SET padres = CONCAT (padre,' - ',madre); + +UPDATE centro\_detenpol SET nacFecha = CONCAT (año,mes,dia); + +UPDATE centro\_registro SET grupo = 'centro'; + +ACTUALIZAR O MODIFICAR LOS ID + +SET @COUNT = 200000; + +UPDATE tabregistro SET tabregistro.id = @count:= @count + 1; + +ALTER TABLE tabregistro AUTO\_INCREMENT=1 + +ACTUALIZAR SQLITE AÑADIENDO EL AÑO SQLITE + +UPDATE tab\_detenidos set atestado = atestado || '/' || + +SUBSTR(CAST(strftime('%Y',fecha\_hora) AS TEXT), 3, 2) + +WHERE atestado NOT LIKE '%/' || SUBSTR(CAST(STRFTIME('%Y', fecha\_hora) AS TEXT), 3, 2); + +QUITAR EL AÑO + +UPDATE tab\_detenidos2 SET atestado = SUBSTR(atestado, 1, LENGTH(atestado) -3) WHERE atestado LIKE "%/%" + +CONCAT + +UPDATE tabregistro SET juzgado=CONCAT(tipoDoc,' ',operacion) where id='1' + +En sqlite en lugar de CONCATE se utiliza || + +UPDATE funcionarios\_agp SET nombre\_comp = (NOMBRE || ' ' || APELLIDOS) where dni='11111111' + +CONTAR NUMERO DE FILAS DE UNA TABLA + +SELECT COUNT(\*) FROM contactos; + +DUPLICAR TABLA + +CREATE TABLE tabla\_nueva LIKE tabla\_original; + + + + + +INSERTAR DATOS DE UNA TABLA A OTRA + +INSERT INTO tabla\_nueva SELECT \* FROM tabla\_original; + + +DUPLICAR TABLA Y INSERTAR TODOS LOS REGISTROS + +CREATE TABLE tabla\_nueva SELECT \* FROM tabla\_original; + +Para sqlite: + +CREATE TABLE nueva\_tabla AS SELECT \* FROM tabla\_original + + +VER REGISTROS DUPLICADOS + +SELECT telefono FROM clientes GROUP BY telefono HAVING COUNT(\*)>1; + +VER REGISTROS DUPLICADOS (CUENTA DE DUPLICADOS) + +SELECT telefono, count(\*) FROM usuarios GROUP BY telefono HAVING COUNT(\*)>1; + +BORRAR REGISTROS DUPLICADOS (TODOS) + +DELETE FROM clientes WHERE telefono IN (SELECT telefono FROM clientes GROUP BY telefono HAVING COUNT(\*)>1) + +BORRAR REGISTROS DUPLICADOS (DEJANDO UNO) repetir varias veces ya que eliminar uno de los duplicados por cada consulta ejecutada. + +DELETE FROM contactos1 WHERE id IN (SELECT \* FROM (SELECT id FROM contactos1 GROUP BY nombre HAVING (COUNT(\*) > 1)) AS A); + +BORRAR REGISTROS DUPLICADOS CREANDO TABLA TEMPORAL + +CREATE TABLE TableA\_Verify AS SELECT DISTINCT \* FROM TableA; + +DELETE FROM TableA; + +INSERT INTO TableA SELECT \* FROM TableA\_Verify; + +DROP TABLE TableA\_Verify; + + +BUSCAR LOS QUE ESTAN REPETIDOS + +SELECT nie, count(\*) FROM identidades + +GROUP BY nie + +HAVING COUNT(\*)>1; + +BORRAR REGISTROS REPETIDOS Y DEJAR SOLO UNO. SE ESCRIBE TODO SEGUIDO EN LA CONSULTA FUNCIONA COMPROBADO. OK + +WITH repetidos AS ( + +SELECT MIN(id) as id, nie FROM identidades + +GROUP BY nie + +HAVING COUNT(\*)>1 + +) + +DELETE FROM identidades + +WHERE id not IN ( + +SELECT id FROM repetidos + +) and nie IN (SELECT nie FROM repetidos) ; + + + + + + +SQLITE + +SELECT atestado, delito, count(\*) FROM tab\_detenidos2 + +GROUP BY atestado + +HAVING COUNT(\*)>1; + +WITH repetidos AS ( + +SELECT MIN(id) as id, atestado FROM tab\_detenidos2 + +GROUP BY atestado + +HAVING COUNT(\*)>1 + +) + +DELETE FROM tab\_detenidos2 + +WHERE id not IN ( + +SELECT id FROM repetidos + +) and atestado IN (SELECT atestado FROM repetidos) and delito <> "RECLAMACIÓN JUDICIAL"; + + + + + + + +DATOS REPETIDOS + +SELECT u.\* FROM usuarios u WHERE telefono IN + +` `( SELECT telefono FROM usuarios GROUP BY telefono HAVING COUNT(\*)>1 ); + +BUSCAR DUPLICADOS + +SE LISTAN TODAS LAS IDENTIDADES QUE ESTAN REPETIDAS + +SELECT tabla\_empleados.\* FROM tabla\_empleados + +WHERE identidad IN ( + +SELECT identidad FROM tabla\_empleados + +GROUP BY identidad + +HAVING COUNT(\*)>1 + +) order by identidad DESC + + +NUMERO DE VECES QUE SE REPITE UNA IDENTIDAD + +SELECT identidad, count(\*) FROM tabla\_empleados + +GROUP BY identidad + +HAVING COUNT(\*)>1; + + +SUMAR VALORES COLUMNAS (SUM) + +SELECT SUM (column\_name) FROM table\_name WHERE condition; + +SELECT SUM (cantidad) as total FROM ventas; + + + +ELIMINAR SALTO DE LINEA con \n por
+ +UPDATE table SET gestiones = REPLACE(gestiones, '\n','
') WHERE id = '8072'; + +REPLACE + +REPLACE(str, find\_string, replace\_with) + +SELECT REPLACE(country,'K','SA') FROM publisher WHERE country='UK'; + +UPDATE tabregistro SET registro = REPLACE(registro, '/2020','/20'); + +CREATE TABLE inves.ciber SELECT \* FROM ciber.principal; + +UPDATE ciber SET asunto1=CONCAT(asunto,' ',tipohecho) + +UPDATE ciber SET implicados=CONCAT(denunciante,' DNI ',dni,' TLFN ',telefono,' + +EMAIL ',email) + +UPDATE ciber SET grupo ='ciber' WHERE grupo LIKE '%tecnologicos%'; + + +Detenpol pasar año de fecha nacimiento a varchar antes de concatenar en fecha nacimiento + + +INSERTAR DATOS DE UNA TABLA A OTRA + +INSERT INTO inves.tabdetenpol SELECT \* FROM bdcentro.centro\_detenpol; + +INSERT INTO inves.taboficios SELECT \* FROM bdcentro.centro\_oficios; + +INSERT INTO inves.tabobjetos SELECT \* FROM bdcentro.centro\_objetos; + +INSERT INTO inves.tabregistro SELECT \* FROM bdcentro.centro\_registro; + +UPDATE tabregistro SET registro = CONCAT(registro,'/20') where id = '6976' + +INSERT INTO tabregistro SELECT \* FROM ciber; + +INSERT INTO tabregistro SELECT \* FROM oeste\_registro; + +iNSERT INTO tabdetenpol SELECT \* FROM ufam\_detenpol; + +update ufam\_oficios set grupo = 'ufam'; + + + +SQLITE COPIAR TABLA DE UNA BD A OTRA BD + +1. Archivo / Anexar base de datos + +Tambien se puede hacer con ATTACH DATABASE 'ruta\_a\_la\_base\_de\_datos\_origen.sqlite' AS origen + +1. CREATE TABLE tab\_desempeño AS SELECT \* FROM data.tab\_desempeño + + +ACTUALIZAR TELEFONOS + +\## MySQL ### + +UPDATE tabcontactos + +SET telefono1 = CONCAT( + +SUBSTRING(telefono1, 1, 3), ' ', + +SUBSTRING(telefono1, 4, 3), ' ', + +SUBSTRING(telefono1, 7, 3) + +) + +WHERE LENGTH(telefono1) = 9; + +\## SQLITE ## + +UPDATE tabcontactos + +SET telefono1 = substr(telefono1, 1, 3) || ' ' || substr(telefono1, 4, 3) || ' ' || substr(telefono1, 7, 3) + +WHERE length(telefono1) = 9; + + +Importar SQL desde XAMPP + +Si trabajamos con un servidor local como XAMPP y necesitamos importar una gran base de datos para trabajar desde nuestro PC, podemos realizar la misma importación desde un terminal mySQL. + +Posicionarnos en la ruta donde se encuentra el servidor mySQL en XAMPP: + +/opt/lampp/bin/ + +Dentro de esta ruta tecleamos la orden: + +./mysql -u root -p base\_de\_datos (se abre terminal mysql en la base seleccionada) + +source /home/jesus/backup.sql + + + + +CONSULTAS APLICACION INVENTARIO + +SELECT + +p.id, + +p.nombre, + +p.precio, + +m.cantidad, + +(p.precio \* m.cantidad) AS precio\_total + +FROM + +productos p + +JOIN + +movimientos m ON p.id = m.producto\_id; + +PRECIO TOTAL DE TODAS LAS UNIDADES VENDIDAS + +SELECT + +SUM(a.precio \* v.unidades\_vendidas) AS precio\_total\_general + +FROM + +articulos a + +JOIN + +ventas v ON a.articulo = v.articulo; + + +FITRAR ENTRE FECHAS + +SELECT + +1. articulo, +1. precio, + +SUM(v.unidades\_vendidas) AS unidades\_vendidas\_periodo, + +SUM(a.precio \* v.unidades\_vendidas) AS precio\_total\_periodo + +FROM + +articulos a + +JOIN + +ventas v ON a.articulo = v.articulo + +WHERE + +v.fecha\_venta BETWEEN '2023-01-01' AND '2023-12-31' + +GROUP BY + +1. articulo, a.precio; + + +TOTAL GENERAL FILTRAR ENTRE FECHAS + +SELECT + +SUM(a.precio \* v.unidades\_vendidas) AS precio\_total\_periodo + +FROM + +articulos a + +JOIN + +ventas v ON a.articulo = v.articulo + +WHERE + +v.fecha\_venta BETWEEN '2023-01-01' AND '2023-12-31'; + +\--------------------------- + +CONSULTA BASE\_D + +SELECT grupo, COUNT(\*) FROM `tabregistro` WHERE grupo = 'centro' AND fechaEnt BETWEEN '2025-01-01' AND '2025-09-25'; + +SELECT grupo, COUNT(\*) FROM `tabregistro` WHERE grupo = 'norte' AND fechaEnt BETWEEN '2025-01-01' AND '2025-09-25'; + +SELECT grupo, COUNT(\*) FROM `tabregistro` WHERE grupo = 'este' AND fechaEnt BETWEEN '2025-01-01' AND '2025-09-25'; + +SELECT grupo, COUNT(\*) FROM `tabregistro` WHERE grupo = 'oeste' AND fechaEnt BETWEEN '2025-01-01' AND '2025-09-25'; + +SELECT grupo, COUNT(\*) FROM taboficios WHERE grupo = 'centro' AND fecha BETWEEN '2025-01-01' AND '2025-09-25'; + +SELECT grupo, COUNT(\*) FROM taboficios WHERE grupo = 'norte' fecha BETWEEN '2025-01-01' AND '2025-09-25'; + +SELECT grupo, COUNT(\*) FROM taboficios WHERE grupo = 'este' AND fecha BETWEEN '2025-01-01' AND '2025-09-25'; + +SELECT grupo, COUNT(\*) FROM taboficios WHERE grupo = 'oeste' AND fecha BETWEEN '2025-01-01' AND '2025-09-25'; + +CENTRO 4083 107 + +NORTE 3841 677 + +ESTE 1828 207 + +OESTE 6500 210 + +\------------------------------- + + diff --git a/Guia_nextcloud.md b/Guia_nextcloud.md new file mode 100644 index 0000000..f0524cd --- /dev/null +++ b/Guia_nextcloud.md @@ -0,0 +1,155 @@ +INSTALAR NEXTCLOUD UBUNTU-SERVER CON ZIP OFICIAL (latest.zip) + +Instala Apache, PHP y MySQL: +sudo apt update +sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql php-gd php-json php-xml php-curl php-zip php-mbstring php-bcmath unzip -y + + +Configura la base de datos: +sudo mysql +CREATE DATABASE nextcloud; +CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'password123'; +GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost'; +FLUSH PRIVILEGES; +EXIT; + +Descarga Nextcloud: +wget https://download.nextcloud.com/server/releases/latest.zip +unzip latest.zip +sudo mv nextcloud /var/www/html/ +sudo chown -R www-data:www-data /var/www/html/nextcloud + +Crea archivo de configuración en Apache: +sudo nano /etc/apache2/sites-available/nextcloud.conf + + + ServerAdmin admin@localhost + DocumentRoot /var/www/html/nextcloud + ServerName localhost.local + + + Require all granted + AllowOverride All + Options +FollowSymlinks + + + ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log + CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined + + + +Activa el sitio y módulos necesarios: +sudo a2ensite nextcloud.conf +sudo a2enmod rewrite headers env dir mime +sudo systemctl reload apache2 + +Abre el navegador y escribe http://IP_DEL_SERVIDOR/nextcloud + +BACKUP nextcloud +sudo -E -u www-data php occ maintenance:mode --on +rsync -Aavx nextcloud/ nextcloud-dirbkp_`date +"%Y%m%d"`/ +mysqldump --single-transaction --no-tablespaces -h [server] -u [username] -p[password] [db_name] > nextcloud-sqlbkp_`date +"%Y%m%d"`.bak +mysqldump --single-transaction --default-character-set=utf8mb4 -h [server] -u [username] -p[password] [db_name] > nextcloud-sqlbkp_`date +"%Y%m%d"`.bak +sudo -E -u www-data php occ maintenance:mode --off + + +RESTORE nextcloud +rsync -Aax nextcloud-dirbkp/ nextcloud/ +mysql -h [server] -u [username] -p[password] -e "DROP DATABASE nextcloud" +mysql -h [server] -u [username] -p[password] -e "CREATE DATABASE nextcloud" +utf8 +mysql -h [server] -u [username] -p[password] -e "DROP DATABASE nextcloud" +mysql -h [server] -u [username] -p[password] -e "CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" +mysql -h [server] -u [username] -p[password] [db_name] < nextcloud-sqlbkp.bak + +Copiar archivos del servidor ubuntu a nextcloud +sudo cp -R /ruta/de/tus/archivos/* /var/www/html/nextcloud/data//files/Destino/ + +sudo -u www-data php /var/www/html/nextcloud/occ files:scan --path="/files/Destino" + +Nota para o siguiente: Ha funcionado sin crear directorio destino ni dar permisos. +No copies archivos cuando el usuario esté accediendo a Nextcloud; podrías corromper datos. +Asegúrate de que el directorio de destino (Destino) exista previamente, o créalo con: +mkdir /var/www/nextcloud/data//files/Destino +chown -R www-data:www-data /var/www/nextcloud/data//files/Destino + +Eliminar bloqueos base de datos de Nextcloud +Nextcloud a veces deja bloqueos en la base de datos que impiden operaciones de archivos. +sudo mysql -u root -p + +Selecciona base datos Nextcloud +USE nextcloud; +DELETE FROM oc_file_locks WHERE 1; +EXIT; + +--------------------------------------- + +INSTALACION SNAP +sudo snap install nextcloud + +1. BACKUP-RESTORE USANDO SNAP SAVE-RESTORE +https://github.com/nextcloud-snap/nextcloud-snap/wiki/Backup-and-Restore + +Backup. +stop Nextcloud snap sudo snap stop nextcloud +save Nextcloud snap sudo snap save nextcloud +start Nextcloud snap sudo snap start nextcloud +copy/move snapshot (*.zip) in /var/lib/snapd/snapshots to wherever + +Restore +copy/move snapshot (*.zip) to /var/lib/snapd/snapshots +discover snapshot-id using snap saved +restore snapshot sudo snap restore + +Deleting snap snapshots +Procedure +discover snapshot-id using snap saved +delete snapshot sudo snap forget + + +2. BACKUP-RESTORE USANDO NEXTCLOUD.EXPORT / NEXTCLOUD.IMPORT +https://github.com/nextcloud-snap/nextcloud-snap/wiki/How-to-backup-your-instance + +Exportar/backup + +nextcloud.export +Se guarda una carpeta con fecha y hora (ej:20190121-153921,) dentro de /var/snap/nextcloud/common/backups/. + +Se puede crear un tar o tar.gz (comprimido) +sudo tar -czf 20190121-153921_nextcloud-backup.tar.gz /var/snap/nextcloud/common/backups/20190121-153921 + +Importar/restore +Extraer el archivo tar o tar.gz +sudo tar -xvf 20190121-153921_nextcloud-backup.tar.gz + +Colocar la carpeta extraida (nombre fecha y hora) en: +/var/snap/nextcloud/common o /var/snap/nextcloud/current/ + +sudo nextcloud.import path/to/backup/dir.** + + +sudo mv 20190121-153921_nextcloud-backup.tar /var/snap/nextcloud/current/ +sudo chown -R root:root /var/snap/nextcloud/current/20190121-153921/ + + +Opciones: +-h: Display this help message +-a: Include the (non-default) apps +-b: Include the database +-c: Include the config +-d: Include the data (can be quite large) + +Q. Can exporting specify the data directory? +A. Not directly, but you should be able to use a symlink. For example, creating a symlink from the data directory to /var/snap/nextcloud/common/nextcloud/data + + +Q. Can I somehow export/import my HTTPS certs? +A. Yes, everything related to them is stored in the /var/snap/nextcloud/current/certs directory, so copying it and preserving its permissions and owner works. + + +Borrar bloqueos de nextcloud instalado con docker +docker exec -it nextcloud_app php occ maintenance:mode --on +docker exec -it nextcloud_db mysql -u nextcloud -pnextcloudpass nextcloud -e "DELETE FROM oc_file_locks;" +docker exec -it nextcloud_app php occ maintenance:mode --off +docker compose restart + diff --git a/Guia_pip.md b/Guia_pip.md new file mode 100644 index 0000000..0b3917b --- /dev/null +++ b/Guia_pip.md @@ -0,0 +1,109 @@ +AYUDA PIP + +\========= + +sudo apt install python3-pip PIP Instalación linux + +python3 -m pip --version Versión pip + +pip list Lista paquetes pip + +pip show package\_name Info de un paquete + +pip list | greb nombre Buscar paquete linux + +pip list | findstr nombre Buscar paquete windows + +En consola python + +import nombre\_paquete - Si no esta lanzara error + +pip install Pillow==9.5.0 Instalar versión paquete + +INSTALAR ARCHIVOS DESCARGADOS + +pip install nombrepaquete --no-index --find-links=. # un paquete concreto + +Tambien se puede hacer así: + +python -m pip install nombrepaquete --no-index --find-links=. + +pip install --no-index --find-links=paquetes\_offline -r requirements.txt # varios paquetes numerados en archivo requirements + +pip install --no-index --find-links=. -r requirements.txt #desde la carpeta en la que estan + + + +Si necesitas instalar virtualenv en un entorno sin conexión a internet, deberás preparar todos los archivos necesarios con anticipación. Aquí te explico los pasos para hacerlo: + +Paso 1: Descargar los paquetes necesarios + +Primero, en una máquina con acceso a internet, descarga virtualenv y sus dependencias. Para ello, puedes usar el siguiente comando: + +pip download virtualenv + +pip download pip setuptools # Esto descargará los archivos necesarios para instalar pip y setuptools. + +Descargar varios paquetes + +pip download pyperclip==1.8.2 requests==2.28.1 numpy==1.21.2 -d paquetes\_offline + +Ejecuta el siguiente comando para descargar los paquetes y sus dependencias en un directorio específico (paquetes\_offline en este ejemplo): + +pip download -r requirements.txt -d paquetes\_offline + +pip download -r requirements.txt -d # desde la misma carpeta + +Ej: + +requirements.txt: + +pyperclip==1.8.2 + +requests==2.28.1 + +numpy==1.21.2 + +Este comando descargará el archivo .whl o .tar.gz de virtualenv junto con todas sus dependencias en el directorio actual. + +Paso 3: Transferir los archivos al entorno sin conexión + +Copia todos los archivos descargados a un dispositivo USB, una carpeta compartida, o cualquier medio de transferencia para llevarlos a la máquina sin conexión. + +Paso 4: Instalar pip, setuptools, y virtualenv + +En la máquina sin conexión, navega hasta el directorio donde has copiado los archivos y ejecuta los siguientes comandos para instalar pip, setuptools, y virtualenv: + +Instalar pip y setuptools: + +python -m pip install pip setuptools --no-index --find-links=. + +Instalar virtualenv: + +python -m pip install virtualenv --no-index --find-links=. + +Archivos necesarios + +Para resumir, estos son los archivos que debes tener en tu máquina sin conexión: + +Paquete virtualenv: virtualenv-X.X.X-py2.py3-none-any.whl o virtualenv-X.X.X.tar.gz + +Dependencias de virtualenv: Cualquier archivo .whl o .tar.gz que se descargó como dependencia. + +pip y setuptools: Paquetes pip-X.X.X-py2.py3-none-any.whl y setuptools-X.X.X-py2.py3-none-any.whl o sus equivalentes .tar.gz. + +Nota importante + +Compatibilidad: Asegúrate de que todos los archivos que descargues sean compatibles con la versión de Python instalada en la máquina sin conexión. + +Instalación offline de dependencias: Usando --no-index --find-links=. en los comandos de instalación, te aseguras de que pip utilice exclusivamente los archivos locales y no intente buscar en PyPI. + +Guardar los paquetes instalados + +pip freeze > requirements.txt + +Instalar los paquetes en un entorno + +pip install -r requirements.txt + + diff --git a/Guia_prepare_statements_cruds.md b/Guia_prepare_statements_cruds.md new file mode 100644 index 0000000..455b95c --- /dev/null +++ b/Guia_prepare_statements_cruds.md @@ -0,0 +1,1106 @@ + +CRUD con MySQL usando Prepared Statements (recomendado) + +connect\_error) { + +die("Error de conexión: " . $conn->connect\_error); + +} + +// ========== CREATE (INSERT) ========== + +function createUser($nombre, $email) { + +global $conn; + +$stmt = $conn->prepare("INSERT INTO usuarios (nombre, email) VALUES (?, ?)"); + +$stmt->bind\_param("ss", $nombre, $email); + +if ($stmt->execute()) { + +echo "Usuario creado con ID: " . $stmt->insert\_id . "\n"; + +} else { + +echo "Error al crear usuario: " . $stmt->error . "\n"; + +} + +$stmt->close(); + +} + +// ========== READ (SELECT) ========== + +function getUsers() { + +global $conn; + +$stmt = $conn->prepare("SELECT id, nombre, email FROM usuarios"); + +$stmt->execute(); + +$result = $stmt->get\_result(); + +$users = []; + +while ($row = $result->fetch\_assoc()) { + +$users[] = $row; + +} + +$stmt->close(); + +return $users; + +} + +// ========== UPDATE ========== + +function updateUser($id, $nombre, $email) { + +global $conn; + +$stmt = $conn->prepare("UPDATE usuarios SET nombre = ?, email = ? WHERE id = ?"); + +$stmt->bind\_param("ssi", $nombre, $email, $id); + +if ($stmt->execute()) { + +echo "Usuario actualizado. Filas afectadas: " . $stmt->affected\_rows . "\n"; + +} else { + +echo "Error al actualizar: " . $stmt->error . "\n"; + +} + +$stmt->close(); + +} + +// ========== DELETE ========== + +function deleteUser($id) { + +global $conn; + +$stmt = $conn->prepare("DELETE FROM usuarios WHERE id = ?"); + +$stmt->bind\_param("i", $id); + +if ($stmt->execute()) { + +echo "Usuario eliminado. Filas afectadas: " . $stmt->affected\_rows . "\n"; + +} else { + +echo "Error al eliminar: " . $stmt->error . "\n"; + +} + +$stmt->close(); + +} + +// ========== EJEMPLOS DE USO ========== + +// Crear usuario + +createUser("Juan Pérez", "juan@example.com"); + +// Obtener todos los usuarios + +$usuarios = getUsers(); + +print\_r($usuarios); + +// Actualizar usuario (asumiendo que existe el ID 1) + +updateUser(1, "Juan García", "juan.garcia@example.com"); + +// Eliminar usuario (asumiendo que existe el ID 2) + +deleteUser(2); + +// Cerrar conexión + +$conn->close(); + +?> + + +Ejemplo de SELECT con Prepared Statements en MySQLi + +Aquí tienes un ejemplo completo de cómo realizar consultas SELECT usando prepared statements con MySQLi: + +1. Ejemplo básico (obtener múltiples registros) + +connect\_error) { + +die("Error de conexión: " . $conn->connect\_error); + +} + +// Preparar la consulta SELECT + +$stmt = $conn->prepare("SELECT id, nombre, email FROM usuarios WHERE activo = ?"); + +$activo = 1; // Valor para el parámetro + +$stmt->bind\_param("i", $activo); // "i" indica que es un entero + +// Ejecutar la consulta + +$stmt->execute(); + +// Obtener resultados + +$result = $stmt->get\_result(); + +// Procesar resultados + +echo "Usuarios activos:\n"; + +while ($row = $result->fetch\_assoc()) { + +echo "ID: " . $row['id'] . ", Nombre: " . $row['nombre'] . ", Email: " . $row['email'] . "\n"; + +} + +// Cerrar statement y conexión + +$stmt->close(); + +$conn->close(); + +?> + +1. Ejemplo con parámetros dinámicos + +prepare("SELECT id, nombre, email FROM usuarios WHERE nombre LIKE ?"); + +$param = "%" . $nombre . "%"; // Búsqueda parcial + +$stmt->bind\_param("s", $param); // "s" indica string + +$stmt->execute(); + +$result = $stmt->get\_result(); + +$usuarios = []; + +while ($row = $result->fetch\_assoc()) { + +$usuarios[] = $row; + +} + +$stmt->close(); + +return $usuarios; + +} + +// Ejemplo de uso + +$resultados = buscarUsuariosPorNombre("Juan"); + +print\_r($resultados); + +$conn->close(); + +?> + +1. Ejemplo con múltiples parámetros + +prepare("SELECT \* FROM usuarios WHERE edad > ? AND pais = ?"); + +$edad\_minima = 18; + +$pais = "España"; + +$stmt->bind\_param("is", $edad\_minima, $pais); // "is" = integer + string + +$stmt->execute(); + +$result = $stmt->get\_result(); + +while ($row = $result->fetch\_assoc()) { + +echo "Usuario: " . $row['nombre'] . " (" . $row['edad'] . " años)\n"; + +} + +$stmt->close(); + +$conn->close(); + +?> + +1. Ejemplo con ORDER BY y LIMIT + +prepare("SELECT nombre, email FROM usuarios ORDER BY fecha\_registro DESC LIMIT ?"); + +$limite = 10; + +$stmt->bind\_param("i", $limite); + +$stmt->execute(); + +$result = $stmt->get\_result(); + +echo "Últimos 10 usuarios registrados:\n"; + +while ($row = $result->fetch\_assoc()) { + +echo "- " . $row['nombre'] . ": " . $row['email'] . "\n"; + +} + +$stmt->close(); + +$conn->close(); + +?> + + +Ventajas de usar prepared statements para SELECT: + +Seguridad: Previene inyección SQL al separar claramente los datos de la consulta + +Rendimiento: Mejor performance en consultas repetidas (el motor prepara la consulta una vez) + +Claridad: Código más organizado y mantenible + +Tipado seguro: Los parámetros se vinculan con su tipo correcto (entero, string, etc.) + +Tipos de parámetros en bind\_param(): + +"i" - integer (entero) + +"d" - double (decimal) + +"s" - string (cadena) + +"b" - blob (datos binarios) + +Puedes combinar tipos cuando tienes múltiples parámetros: $stmt->bind\_param("iss", $id, $nombre, $email); + +Recomendación: + +Usa new mysqli() porque: + +Es más moderno y consistente con PHP actual + +Mejor para mantenimiento de código + +Permite encadenamiento de métodos + +Más intuitivo en frameworks modernos + + + + +CRUD con MySQL sin Prepared Statements (no recomendado) + +Aquí tienes el mismo CRUD pero sin utilizar prepared statements. Importante: Este método es menos seguro y no se recomienda para producción, ya que es vulnerable a inyección SQL. + +connect\_error) { + +die("Error de conexión: " . $conn->connect\_error); + +} + +// ========== CREATE (INSERT) ========== + +function createUser($nombre, $email) { + +global $conn; + +// Escapar valores para prevenir inyección SQL (no es tan seguro como prepared statements) + +$nombre = $conn->real\_escape\_string($nombre); + +$email = $conn->real\_escape\_string($email); + +$sql = "INSERT INTO usuarios (nombre, email) VALUES ('$nombre', '$email')"; + +if ($conn->query($sql)) { + +echo "Usuario creado con ID: " . $conn->insert\_id . "\n"; + +} else { + +echo "Error al crear usuario: " . $conn->error . "\n"; + +} + +} + +// ========== READ (SELECT) ========== + +function getUsers() { + +global $conn; + +$sql = "SELECT id, nombre, email FROM usuarios"; + +$result = $conn->query($sql); + +$users = []; + +if ($result->num\_rows > 0) { + +while ($row = $result->fetch\_assoc()) { + +$users[] = $row; + +} + +} + +return $users; + +} + +// ========== UPDATE ========== + +function updateUser($id, $nombre, $email) { + +global $conn; + +// Escapar valores + +$id = (int)$id; // Forzar tipo entero + +$nombre = $conn->real\_escape\_string($nombre); + +$email = $conn->real\_escape\_string($email); + +$sql = "UPDATE usuarios SET nombre = '$nombre', email = '$email' WHERE id = $id"; + +if ($conn->query($sql)) { + +echo "Usuario actualizado. Filas afectadas: " . $conn->affected\_rows . "\n"; + +} else { + +echo "Error al actualizar: " . $conn->error . "\n"; + +} + +} + +// ========== DELETE ========== + +function deleteUser($id) { + +global $conn; + +$id = (int)$id; // Forzar tipo entero + +$sql = "DELETE FROM usuarios WHERE id = $id"; + +if ($conn->query($sql)) { + +echo "Usuario eliminado. Filas afectadas: " . $conn->affected\_rows . "\n"; + +} else { + +echo "Error al eliminar: " . $conn->error . "\n"; + +} + +} + +// ========== EJEMPLOS DE USO ========== + +// Crear usuario + +createUser("Juan Pérez", "juan@example.com"); + +// Obtener todos los usuarios + +$usuarios = getUsers(); + +print\_r($usuarios); + +// Actualizar usuario (asumiendo que existe el ID 1) + +updateUser(1, "Juan García", "juan.garcia@example.com"); + +// Eliminar usuario (asumiendo que existe el ID 2) + +deleteUser(2); + +// Cerrar conexión + +$conn->close(); + +?> + +Diferencias clave con la versión con prepared statements: + +Seguridad: + +Se usa real\_escape\_string() en lugar de parámetros enlazados + +Se fuerza el tipo de datos con (int) para IDs + +Aún así es menos seguro que los prepared statements + +Sintaxis: + +Consultas directas con concatenación de strings + +No hay bind\_param() ni execute() + +Se usa $conn->query() directamente + +Manejo de resultados: + +Se accede a conn->insert\_id en lugar de stmt->insert\_id + +Se usa conn->affected\_rows en lugar de stmt->affected\_rows + +Advertencia importante: + +Este método no es recomendable para aplicaciones reales porque: + +real\_escape\_string() no protege completamente contra inyección SQL + +La conversión de tipos manual es propensa a errores + +Es más difícil mantener el código + +No aprovecha las optimizaciones del servidor SQL + +Los prepared statements son el método recomendado para interactuar con bases de datos en PHP por su seguridad y eficiencia. + + +\------------------------------------------------------------------------------------------------------------------------------ + +CRUD con SQLite usando Prepared Statements (recomendado) + +setAttribute(PDO::ATTR\_ERRMODE, PDO::ERRMODE\_EXCEPTION); + +// Crear tabla si no existe + +$db->exec("CREATE TABLE IF NOT EXISTS productos ( + +id INTEGER PRIMARY KEY AUTOINCREMENT, + +nombre TEXT NOT NULL, + +precio REAL NOT NULL, + +stock INTEGER NOT NULL + +)"); + +// ========== CREATE (INSERT) ========== + +function crearProducto($nombre, $precio, $stock) { + +global $db; + +$stmt = $db->prepare("INSERT INTO productos (nombre, precio, stock) VALUES (?, ?, ?)"); + +$stmt->execute([$nombre, $precio, $stock]); + +return $db->lastInsertId(); + +} + +// ========== READ (SELECT) ========== + +function obtenerProductos() { + +global $db; + +$stmt = $db->prepare("SELECT \* FROM productos"); + +$stmt->execute(); + +return $stmt->fetchAll(PDO::FETCH\_ASSOC); + +} + +function obtenerProductoPorId($id) { + +global $db; + +$stmt = $db->prepare("SELECT \* FROM productos WHERE id = ?"); + +$stmt->execute([$id]); + +return $stmt->fetch(PDO::FETCH\_ASSOC); + +} + +// ========== UPDATE ========== + +function actualizarProducto($id, $nombre, $precio, $stock) { + +global $db; + +$stmt = $db->prepare("UPDATE productos SET nombre = ?, precio = ?, stock = ? WHERE id = ?"); + +$stmt->execute([$nombre, $precio, $stock, $id]); + +return $stmt->rowCount(); + +} + +// ========== DELETE ========== + +function eliminarProducto($id) { + +global $db; + +$stmt = $db->prepare("DELETE FROM productos WHERE id = ?"); + +$stmt->execute([$id]); + +return $stmt->rowCount(); + +} + +// ===== Ejemplos de uso ===== + +// Crear + +$idNuevo = crearProducto("Laptop", 1200.50, 10); + +echo "Producto creado con ID: $idNuevo\n"; + +// Leer todos + +$productos = obtenerProductos(); + +print\_r($productos); + +// Leer uno + +$producto = obtenerProductoPorId(1); + +print\_r($producto); + +// Actualizar + +$filasActualizadas = actualizarProducto(1, "Laptop Pro", 1350.75, 8); + +echo "Filas actualizadas: $filasActualizadas\n"; + +// Eliminar + +$filasEliminadas = eliminarProducto(2); + +echo "Filas eliminadas: $filasEliminadas\n"; + +} catch (PDOException $e) { + +die("Error con SQLite: " . $e->getMessage()); + +} + +?> + +CRUD con SQLite usando Prepared Statements (sin PDO) + +enableExceptions(true); + +// Crear tabla si no existe + +$db->exec("CREATE TABLE IF NOT EXISTS productos ( + +id INTEGER PRIMARY KEY AUTOINCREMENT, + +nombre TEXT NOT NULL, + +precio REAL NOT NULL, + +stock INTEGER NOT NULL + +)"); + +// ========== CREATE (INSERT) con prepared statement ========== + +function crearProducto($nombre, $precio, $stock) { + +global $db; + +$stmt = $db->prepare("INSERT INTO productos (nombre, precio, stock) VALUES (:nombre, :precio, :stock)"); + +$stmt->bindValue(':nombre', $nombre, SQLITE3\_TEXT); + +$stmt->bindValue(':precio', $precio, SQLITE3\_FLOAT); + +$stmt->bindValue(':stock', $stock, SQLITE3\_INTEGER); + +$result = $stmt->execute(); + +return $db->lastInsertRowID(); + +} + +// ========== READ (SELECT) con prepared statement ========== + +function obtenerProductos() { + +global $db; + +$stmt = $db->prepare("SELECT \* FROM productos"); + +$result = $stmt->execute(); + +$productos = []; + +while ($row = $result->fetchArray(SQLITE3\_ASSOC)) { + +$productos[] = $row; + +} + +return $productos; + +} + +function obtenerProductoPorId($id) { + +global $db; + +$stmt = $db->prepare("SELECT \* FROM productos WHERE id = :id"); + +$stmt->bindValue(':id', $id, SQLITE3\_INTEGER); + +$result = $stmt->execute(); + +return $result->fetchArray(SQLITE3\_ASSOC); + +} + +// ========== UPDATE con prepared statement ========== + +function actualizarProducto($id, $nombre, $precio, $stock) { + +global $db; + +$stmt = $db->prepare("UPDATE productos SET nombre = :nombre, precio = :precio, stock = :stock WHERE id = :id"); + +$stmt->bindValue(':nombre', $nombre, SQLITE3\_TEXT); + +$stmt->bindValue(':precio', $precio, SQLITE3\_FLOAT); + +$stmt->bindValue(':stock', $stock, SQLITE3\_INTEGER); + +$stmt->bindValue(':id', $id, SQLITE3\_INTEGER); + +$stmt->execute(); + +return $db->changes(); + +} + +// ========== DELETE con prepared statement ========== + +function eliminarProducto($id) { + +global $db; + +$stmt = $db->prepare("DELETE FROM productos WHERE id = :id"); + +$stmt->bindValue(':id', $id, SQLITE3\_INTEGER); + +$stmt->execute(); + +return $db->changes(); + +} + +// ===== Ejemplos de uso ===== + +// Crear producto + +$idNuevo = crearProducto("Monitor", 199.99, 15); + +echo "Producto creado con ID: $idNuevo\n"; + +// Leer todos los productos + +$productos = obtenerProductos(); + +print\_r($productos); + +// Leer un producto específico + +$producto = obtenerProductoPorId(1); + +print\_r($producto); + +// Actualizar producto + +$filasActualizadas = actualizarProducto(1, "Monitor HD", 179.99, 10); + +echo "Filas actualizadas: $filasActualizadas\n"; + +// Eliminar producto + +$filasEliminadas = eliminarProducto(2); + +echo "Filas eliminadas: $filasEliminadas\n"; + +} catch (Exception $e) { + +die("Error con SQLite: " . $e->getMessage()); + +} finally { + +if (isset($db)) { + +$db->close(); + +} + +} + +?> + +Características clave: + +Prepared Statements nativos de SQLite3: + +Uso de prepare() para crear statements + +bindValue() para vincular parámetros + +Tipos de datos definidos (SQLITE3\_TEXT, SQLITE3\_INTEGER, etc.) + +Métodos importantes: + +execute() para ejecutar el statement preparado + +fetchArray(SQLITE3\_ASSOC) para obtener resultados + +lastInsertRowID() para obtener el último ID insertado + +changes() para obtener filas afectadas + +Tipos de datos para bindValue(): + +SQLITE3\_INTEGER + +SQLITE3\_FLOAT + +SQLITE3\_TEXT + +SQLITE3\_BLOB + +SQLITE3\_NULL + +Ventajas: + +Seguridad contra inyección SQL + +Manejo adecuado de tipos de datos + +No requiere PDO + +Sintaxis específica para SQLite + +Diferencia con la versión PDO: + +Sintaxis: + +PDO usa ? o :nombre para placeholders + +SQLite3 nativo usa :nombre principalmente + +Métodos: + +PDO tiene bindParam() y bindValue() + +SQLite3 nativo solo tiene bindValue() + +Tipos de resultados: + +PDO ofrece fetchAll() y varios estilos de fetch + +SQLite3 nativo usa fetchArray() con constantes para el estilo + +En SQLite3 usando la extensión nativa de PHP (no PDO), no se usa el sistema de tipos combinados como en MySQLi ("iss"). + +En su lugar, debes especificar el tipo para cada parámetro individualmente usando bindValue(). + + + +CRUD con SQLite sin Prepared Statements (no recomendado) + +exec("CREATE TABLE IF NOT EXISTS productos ( + +id INTEGER PRIMARY KEY AUTOINCREMENT, + +nombre TEXT NOT NULL, + +precio REAL NOT NULL, + +stock INTEGER NOT NULL + +)"); + +// ========== CREATE (INSERT) ========== + +function crearProducto($nombre, $precio, $stock) { + +global $db; + +$nombre = SQLite3::escapeString($nombre); + +$precio = floatval($precio); + +$stock = intval($stock); + +$sql = "INSERT INTO productos (nombre, precio, stock) + +VALUES ('$nombre', $precio, $stock)"; + +if ($db->exec($sql)) { + +return $db->lastInsertRowID(); + +} + +return false; + +} + +// ========== READ (SELECT) ========== + +function obtenerProductos() { + +global $db; + +$result = $db->query("SELECT \* FROM productos"); + +$productos = []; + +while ($row = $result->fetchArray(SQLITE3\_ASSOC)) { + +$productos[] = $row; + +} + +return $productos; + +} + +function obtenerProductoPorId($id) { + +global $db; + +$id = intval($id); + +$result = $db->querySingle("SELECT \* FROM productos WHERE id = $id", true); + +return $result; + +} + +// ========== UPDATE ========== + +function actualizarProducto($id, $nombre, $precio, $stock) { + +global $db; + +$id = intval($id); + +$nombre = SQLite3::escapeString($nombre); + +$precio = floatval($precio); + +$stock = intval($stock); + +$sql = "UPDATE productos SET + +nombre = '$nombre', + +precio = $precio, + +stock = $stock + +WHERE id = $id"; + +return $db->exec($sql); + +} + +// ========== DELETE ========== + +function eliminarProducto($id) { + +global $db; + +$id = intval($id); + +$sql = "DELETE FROM productos WHERE id = $id"; + +return $db->exec($sql); + +} + +// ===== Ejemplos de uso ===== + +// Crear + +$idNuevo = crearProducto("Teclado", 45.99, 25); + +echo "Producto creado con ID: $idNuevo\n"; + +// Leer todos + +$productos = obtenerProductos(); + +print\_r($productos); + +// Leer uno + +$producto = obtenerProductoPorId(1); + +print\_r($producto); + +// Actualizar + +$actualizado = actualizarProducto(1, "Teclado Mecánico", 59.99, 15); + +echo "Actualizado: " . ($actualizado ? "Sí" : "No") . "\n"; + +// Eliminar + +$eliminado = eliminarProducto(3); + +echo "Eliminado: " . ($eliminado ? "Sí" : "No") . "\n"; + +} catch (Exception $e) { + +die("Error con SQLite: " . $e->getMessage()); + +} + +?> diff --git a/Guia_python.md b/Guia_python.md new file mode 100644 index 0000000..3efd916 --- /dev/null +++ b/Guia_python.md @@ -0,0 +1,253 @@ +AYUDA PYTHON + +\============ + + +INSTALAR ENTORNO VIRTUAL EN LINUX + +sudo apt install python3-venv (instalacion previa Linux) + +INSTALAR ENTORNO VIRTUAL UTILIZANDO virtualenv + +Windows pip install virtualenv + +Linux sudo apt install virtualenv + +CREAR ENTRONO VIRTUAL + +windows/linux python -m venv + +osx/linux virtualenv + +Activar entorno virtual + +cmd.exe \Scripts\Activate.bat + +Powershell -VSCode \Scripts\Activate.ps1 + +Bash shell ..//Scripts/activate + +OSX/Linux (bash) source /bin/activate + +Desactivar entorno virtual + +deactivate + + +Actualizar rutas y dependencias de entorno virtual + +python -m venv venv --upgrade + +python -m venv venv --upgrade-deps + + +Instalar paquetes en entorno virtual + +Individual pip install nombre\_paquete + +Lista de paquetes pip install -r requirements.txt + +pip install customtkinter pyperclip tkcalendar Pillow python-docx #instalar varios paquetes + +INSTALAR ARCHIVOS DESCARGADOS + +pip install nombrepaquete --no-index --find-links=. # un paquete concreto + +Tambien se puede hacer así: + +python -m pip install nombrepaquete --no-index --find-links=. + +pip install --no-index --find-links=paquetes\_offline -r requirements.txt # varios paquetes numerados en archivo requirements + +pip install --no-index --find-links=. -r requirements.txt #desde la carpeta en la que estan + + +Si necesitas instalar virtualenv en un entorno sin conexión a internet, deberás preparar todos los archivos necesarios con anticipación. Aquí te explico los pasos para hacerlo: + +Paso 1: Descargar los paquetes necesarios + +Primero, en una máquina con acceso a internet, descarga virtualenv y sus dependencias. Para ello, puedes usar el siguiente comando: + +pip download virtualenv + +pip download pip setuptools # Esto descargará los archivos necesarios para instalar pip y setuptools. + +Descargar varios paquetes + +pip download pyperclip==1.8.2 requests==2.28.1 numpy==1.21.2 -d paquetes\_offline + +Ejecuta el siguiente comando para descargar los paquetes y sus dependencias en un directorio específico (paquetes\_offline en este ejemplo): + +pip download -r requirements.txt -d paquetes\_offline + +pip download -r requirements.txt -d # desde la misma carpeta + +Ej: + +requirements.txt: + +pyperclip==1.8.2 + +requests==2.28.1 + +numpy==1.21.2 + +Este comando descargará el archivo .whl o .tar.gz de virtualenv junto con todas sus dependencias en el directorio actual. + +Paso 3: Transferir los archivos al entorno sin conexión + +Copia todos los archivos descargados a un dispositivo USB, una carpeta compartida, o cualquier medio de transferencia para llevarlos a la máquina sin conexión. + +Paso 4: Instalar pip, setuptools, y virtualenv + +En la máquina sin conexión, navega hasta el directorio donde has copiado los archivos y ejecuta los siguientes comandos para instalar pip, setuptools, y virtualenv: + +Instalar pip y setuptools: + +python -m pip install pip setuptools --no-index --find-links=. + +Instalar virtualenv: + +python -m pip install virtualenv --no-index --find-links=. + +Archivos necesarios + +Para resumir, estos son los archivos que debes tener en tu máquina sin conexión: + +Paquete virtualenv: virtualenv-X.X.X-py2.py3-none-any.whl o virtualenv-X.X.X.tar.gz + +Dependencias de virtualenv: Cualquier archivo .whl o .tar.gz que se descargó como dependencia. + +pip y setuptools: Paquetes pip-X.X.X-py2.py3-none-any.whl y setuptools-X.X.X-py2.py3-none-any.whl o sus equivalentes .tar.gz. + +Nota importante + +Compatibilidad: Asegúrate de que todos los archivos que descargues sean compatibles con la versión de Python instalada en la máquina sin conexión. + +Instalación offline de dependencias: Usando --no-index --find-links=. en los comandos de instalación, te aseguras de que pip utilice exclusivamente los archivos locales y no intente buscar en PyPI. + +Abrir idle python en un entorno virtual: + +python –m idlelib.idle + +Python –m idlelib.idle filename + + +PIP + +sudo apt install python3-pip --upgrade # instalar o actualizar pip en linux + +pip install nombre\_paquete (instalar paquetes) + +pip --version (version de pip instalada) + +pip list (listar paquetes instalados) + +pip list | grep nombre\_del\_paquete (buscar un paquete especifico en la lista) + +pip show package\_name (info de un paquete, saber si esta instalado) + +pip install Pillow==9.5.0 (para una version concreta de un paquete) + +python3 -m pip install --upgrade pip (actualizar pip linux) + +python -m pip install --upgrade pip (actualizar pip windows) + +pip install python-docx (para python3) no pip install docx (deprecated) + + +pip install -r requirements.txt + +pip install -r requirements.txt -d (nombredirectorio) + +* Forzar instalacion de paquetes pip: + +pip install xyz --break-system-packages + + + +script Python para saber si un paquete esta instalado: + +try: + +import nombre\_del\_paquete + +print("El paquete está instalado.") + +except ModuleNotFoundError: + +print("El paquete no está instalado.") + + + +FLET falta libmpv.so.1 + +error while loading shared libraries: libmpv.so.1: cannot open shared object file: No such file or directory + +sudo apt update + +sudo apt install libmpv-dev libmpv2 + +localizar los paquetes instalados: locate libmpv.so + +Despues una opcion de ambas (dependiendo paquete): + +1. - sudo ln -s /usr/lib/x86\_64-linux-gnu/libmpv.so /usr/lib/libmpv.so.1 +1. - sudo ln -s /usr/lib/x86\_64-linux-gnu/libmpv.so.2 /usr/lib/x86\_64-linux-gnu/libmpv.so.1 + + + +PyInstaller + +pip install pyinstaller + +pyinstaller --onefile --noconsole script.py + +--onefile # un archivo + +--noconsole - # sin abrir terminal/consola + +--onedir # crea aplicación en un directorio + +--icon=python.ico # inserta el icono de la aplicacion + + + +EJECUTAR desde terminal archivo Python (linux) + +#!/usr/bin/env python3 + +Para un entorno virtual venv + +#!/ruta/a/tu/virtualenv/bin/python + +Asegúrese de que el archivo sea ejecutable. + +chmod +x nombre\_del\_archivo.py + +./nombre\_del\_archivo.py + + +Poner linea vertical en VsCode para python + +archivo settings.json (editar, buscar con f1) + +añadir: + +"[python]": { + +"editor.rulers": [ + +{ + +"column": 100, + +"color": "#8a8a8a" + +} + +] + +} + + diff --git a/Guia_ubuntu-server.md b/Guia_ubuntu-server.md new file mode 100644 index 0000000..56d564c --- /dev/null +++ b/Guia_ubuntu-server.md @@ -0,0 +1,455 @@ +# AYUDA UBUNTU SERVER + +**LISTAR DISCOS/ESPACIO/DIRECTORIOS** +lsblk -f +sudo fdisk -l +df -h + +--- + +**INFO IP** +ip a Saber la ip del equipo o maquina virtual +hostname -I http://192.168.18.235/ + +--- + +**MONTAR/DESMONTAR USB** +sudo mkdir -p /mnt/mi_usb # Cambia "mi_usb" por el nombre que prefieras +sudo mount /dev/sdb1 /mnt/mi_usb # Reemplaza "/dev/sdb1" con tu dispositivo +sudo mount -t ntfs-3g /dev/sdb1 /mnt/mi_usb # Para NTFS +sudo mount -t vfat /dev/sdb1 /mnt/mi_usb # Para FAT32 +sudo mount -o rw /dev/sdb1 /mnt/mi_usb Si el dispositivo está en modo solo lectura, intenta montarlo con permisos de escritura +sudo apt install ntfs-3g Para dispositivos NTFS, ntfs-3g +sudo umount /dev/sdb1 +sudo umount /mnt/mi_usb + +Montaje automático al recinicar (opcional) +sudo nano /etc/fstab +UUID=.... /mnt/mi_usb ntfs-3g defaults 0 0 +UUID=.... /mnt/externo ext4 defaults,nofail 0 2 + +Para obtener el UUID del dispositivo, usa: +sudo blkid +sudo blkid /dev/sdb1 + +systemctl daemon-reload (recargar informacion discos fstab) + +--- + +**INSTALAR APACHE2** +sudo apt install apache2 -y +sudo ufw allow 'Apache Full' permitir trafico en el firewall +sudo systemctl status apache2 verificar que apache esta funcionando +http:// Probar en el navegador + +--- + +**INSTALAR NGINX** +sudo apt install nginx -y +sudo ufw allow 'Nginx Full' +http:// + +--- + +**INSTALAR MYSQL** +sudo apt install mysql-server -y +sudo mysql_secure_installation Asegurar instalacion de mysql, "yes a todas las opciones" +sudo systemctl status mysql +sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf +bind-address = 0.0.0.0 Cambiar 127.0.0.1 para conectarse desde otro dispositivos de la red (no solo localhost) + +Crear usuario Mysql para aceder desde otro equipo +CREATE USER 'usuario_remoto'@'%' IDENTIFIED BY 'miclave123'; +GRANT ALL PRIVILEGES ON *.* TO 'usuario_remoto'@'%' WITH GRANT OPTION; +FLUSH PRIVILEGES; +EXIT; +Si prefieres restringir a una IP específica de tu red local (por ejemplo, 192.168.1.100), reemplaza '%' por '192.168.1.100'. +sudo systemctl restart mysql Reiniciar mysql +sudo mysql +CREATE DATABASE mi_base_de_datos; Crear base de datos de prueba +EXIT; +SELECT User, Host FROM mysql.user; Ver usuarios existentes + +Eliminar usuario +DROP USER 'nombre_usuario'@'host'; +FLUSH PRIVILEGES; + +--- + +**INSTALAR MARIADB** +sudo apt install mariadb-server -y + +--- + +**INSTALAR PHP** +sudo apt install php libapache2-mod-php php-mysql -y Instalar php y modulos necesarios +php -v Verificar instalacion php +echo "" | sudo tee /var/www/html/info.php crea archivo de prueba en raiz servidor web +http:///info.php verificar instalacion +sudo rm /var/www/html/info.php eliminar archivo de prueba +/var/www/html/ Directorio apache2 para aplicaciones + +--- + +**INSTALAR PHPMYADMIN** +sudo apt install phpmyadmin -y +Elige Apache cuando pregunte el servidor web (usa espacio para seleccionar). +Responde Sí a la configuración de la base de datos con dbconfig-common. +Elige una contraseña para el usuario phpmyadmin. +Habilita phpMyAdmin en Apache (Si no se habilita automáticamente): +sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf +sudo a2enconf phpmyadmin +sudo systemctl reload apache2 +http:///phpmyadmin Acceder a phpmyadmin + +--- + +**WORDPRESS** +Crear base de datos (Linea de comandos o desde phpmyadmin) +sudo mysql -u root -p +CREATE DATABASE wordpress; +CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'tupassword'; +GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost'; +FLUSH PRIVILEGES; +EXIT; + +sudo apt install php libapache2-mod-php php-mysql -y +cd /tmp wget https://wordpress.org/latest.tar.gz Descargar WordPress +tar -xvzf latest.tar.gz Extraer archivo +sudo mv wordpress /var/www/html/ mover directorio WordPress + +sudo chown -R www-data:www-data /var/www/html/wordpress Configurar permisos +sudo chmod -R 755 /var/www/html/wordpress + +sudo cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php Crear archivo configuracion +sudo nano /var/www/html/wordpress/wp-config.php Editar archivo configuracion + +define('DB_NAME', 'wordpress'); +define('DB_USER', 'wpuser'); +define('DB_PASSWORD', 'tu_contraseña_segura'); +define('DB_HOST', 'localhost'); + +sudo nano /etc/apache2/sites-available/wordpress.conf Configurar apache para WordPress + +ServerName localhost +DocumentRoot /var/www/html/wordpress + +AllowOverride All +Require all granted + + + +sudo a2ensite wordpress.conf Habilita sitio y modulo rewrite +sudo a2enmod rewrite +http://localhost/wordpress Completar instalacion de WordPress + +--- + +**SSH** +sudo apt install openssh-server -y Instalar ssh +sudo systemctl status ssh Estado de ssh +sudo systemctl start ssh Activar ssh +sudo systemctl enable ssh Iniciar automáticamente con el sistema +sudo systemctl restart apache2 Reiniciar apache + +sudo ufw allow OpenSSH Permitir ssh en el firewall +sudo ufw enable + +ssh usuario@192.168.1.100 Conectarte desde otro equipo +PuTTY Host name:ip servidor aplicación para windows + +ssh-keygen Configurar acceso sin contraseña con clave SSH +ssh-copy-id usuario@192.168.1.100 + +--- + +**SCP (SECURE COPY)** +scp -r "C:\\ruta\\de\\la\\carpeta" usuario@ip_del_servidor:/home1 Windows +scp -r /ruta/local/carpeta usuario@ip_del_servidor:/home1 WSL +scp -r /mnt/c/Users/usuario/Desktop/micarpeta ubuntu@192.168.1.100:/home1 Ejemplo WSL +scp -r /ruta/carpeta usuario_windows@192.168.1.50:/ruta/de/destino Ubuntu server a Windows +WinSCP Entorno grafico windows + +Dar permisos temporales de root (evita usar sudo cada vez) +sudo chmod -R 775 /home1 + +--- + +**CAMBIAR COLORES TERMINAL** +echo $LS_COLORS Ver configuracion de colores +export LS_COLORS="$LS_COLORS:di=36" Modificar LS_COLORS azul claro +export LS_COLORS="$LS_COLORS:di=94" Azul brillante +echo 'export LS_COLORS="$LS_COLORS:di=36"' >> ~/.bashrc Hacer el cambio permanente +source ~/.bashrc Recargar el archivo + +--- + +**Instalar LAMP - Phpmyadmin** +sudo apt update && sudo apt upgrade +sudo apt install apache2 +sudo apt install mysql-server +sudo mysql_secure_installation +sudo apt install php libapache2-mod-php php-mysql php-sqlite3 +echo "" | sudo tee /var/www/html/info.php +sudo rm /var/www/html/info.php +sudo systemctl restart apache2 +sudo apt install phpmyadmin +seleccionar apache - aceptar dbconfig-common +sudo apt install mysql-workbench +Crear usuario phpmyadmin para acceder: +sudo mysql Entrar mysql +CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'clave_segura'; +GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'localhost' WITH GRANT OPTION; +GRANT ALL PRIVILEGES ON nombre_basedatos.* TO 'usuario'@'localhost'; # Acceso a una sola base datos +FLUSH PRIVILEGES; Aplicar canbios +EXIT; +http://localhost/phpmyadmin Iniciar sesion en phpmyadmin + +Script automatizado +#!/bin/bash +echo "==> Actualizando sistema..." +sudo apt update && sudo apt upgrade -y +echo "==> Instalando Apache..." +sudo apt install apache2 -y +echo "==> Instalando MySQL Server..." +sudo apt install mysql-server -y +echo "==> Ejecutando configuración segura de MySQL..." +sudo mysql_secure_installation +echo "==> Instalando PHP y módulos necesarios..." +sudo apt install php libapache2-mod-php php-mysql -y +echo "==> Reiniciando Apache..." +sudo systemctl restart apache2 +echo "==> Instalando phpMyAdmin..." +sudo apt install phpmyadmin -y +echo "==> Habilitando phpMyAdmin en Apache..." +sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf +sudo a2enconf phpmyadmin +sudo systemctl reload apache2 +echo "==> Instalando MySQL Workbench..." +sudo apt install mysql-workbench -y +echo "==> Instalación completada." +echo "Puedes acceder a phpMyAdmin en: http://localhost/phpmyadmin" +Instrucciones Script +instalar_lamp_phpmyadmin_workbench.sh +chmod +x instalar_lamp_phpmyadmin_workbench.sh Hacer ejecutable +./instalar_lamp_phpmyadmin_workbench.sh Ejecutar script + +--- + +Acceso a mysql / mariadb de ubuntu server + +1. Cambiar ip de acceso (localhost a cualquier ip de otro equipo) En mysql: sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf En mariaDb; sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf Cambiar linea: bind-address = 127.0.0.1 por bind-address = 0.0.0.0 Reiniciar mysql / mariaDb sudo systemctl restart mysql / mariadb + +2.Dar permisos al usuario MySql (%) +sudo mysql -u root -p +Nuevo usuario +CREATE USER 'usuario'@'%' IDENTIFIED BY 'tu_contraseña'; +GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'%' WITH GRANT OPTION; +FLUSH PRIVILEGES; +Con usuario ya creado +GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'%' IDENTIFIED BY 'tu_contraseña'; + +1. Abrir el puerto 3306 en el firewall (si está activo) + sudo ufw allow 3306/tcp + sudo ufw reload +2. Conectarte desde Workbench, heidisql, etc... + +--- + +**MONTAR USB EXTERNO Y PERMISOS (por ejemplo transmission)** +Sistema normal + +sudo fdisk -l identifica/muestra discos conectados +sudo mkdir -p /mnt/mi_usb # Crear punto de montaje (directorio) +sudo mount -t ntfs-3g /dev/sdb1 /mnt/mi_usb # Para NTFS +sudo mount -t vfat /dev/sdb1 /mnt/mi_usb # Para FAT32 +df -h o lsblk -f # verificar +sudo umount /dev/sdb1 o sudo umount /mnt/mi_usb # desmontar + +sudo blkid # identificar UUID del dispositivo +sudo blkid /dev/sdb1 + +sudo chown -R root:debian-transmission /mnt/wd +sudo chmod -R 775 /mnt/wd +sudo chmod g+s /mnt/wd +sudo systemctl daemon-reexec +sudo mount /mnt/wd + +sudo nano /etc/fstab Editar archivo y añadir unidad para montaje automatico al iniciar + +UUID=XXXX-XXXX /mnt/mi_usb ntfs defaults 0 0 +UUID=ABCD-1234 /mnt/toshiba ntfs defaults,uid=debian-transmission,gid=debian-transmission,umask=0022 0 0 unidad ntfs, añadir linea para acceso de transmission +UUID=XXXX-XXXX /mnt/toshiba ext4 defaults 0 2 Unidad ext4 + +--- + +**INSTALAR TRANSMISSION** +sudo apt update +sudo apt install transmission-daemon +sudo systemctl stop transmission-daemon +sudo nano /etc/transmission-daemon/settings.json +"rpc-enabled": true, +"rpc-bind-address": "0.0.0.0", +"rpc-whitelist-enabled": false, +"rpc-username": "admin", +"rpc-password": "tu_contraseña", + +sudo nano/etc/apparmor.d/transmission #modificar la siguiente linea (evita que se desconecte automaticamente): +\-profile transmission-daemon /usr/bin/transmission-daemon flags=(complain) { ++profile transmission-daemon /usr/bin/transmission-daemon flags=(complain,attach_disconnected) { +sudo apparmor_parser -r -W -T /etc/apparmor.d/transmission + +sudo systemctl start transmission-daemon + +http://:9091 + +--- + +**INSTALAR PLEX MEDIA SERVER** +Descargar el paquete de Plex: Ve a https://www.plex.tv/media-server-downloads/ y copia el enlace del .deb para Ubuntu. +wget https://downloads.plex.tv/plex-media-server-new/... +sudo dpkg -i plexmediaserver\_*.deb +sudo systemctl enable plexmediaserver +sudo systemctl start plexmediaserver +http://:32400/web + +--- + +**INSTALAR GITEA** +sudo snap install gitea + +--- + +**INSTALAR NEXTCLOUD** +Instala Apache, PHP y MySQL: +sudo apt update +sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql php-gd php-json php-xml php-curl php-zip php-mbstring php-bcmath unzip -y + +Configura la base de datos: +sudo mysql +CREATE DATABASE nextcloud; +CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'tupasswordsegura'; +GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost'; +FLUSH PRIVILEGES; +EXIT; + +Descarga Nextcloud: +wget https://download.nextcloud.com/server/releases/latest.zip +unzip latest.zip +sudo mv nextcloud /var/www/html/ +sudo chown -R www-data:www-data /var/www/html/nextcloud + +Crea archivo de configuración en Apache: +sudo nano /etc/apache2/sites-available/nextcloud.conf + +ServerAdmin admin@localhost +DocumentRoot /var/www/html/nextcloud +ServerName nextcloud.local + +``` + + Options +FollowSymlinks + AllowOverride All + Require all granted + + +ErrorLog ${APACHE_LOG_DIR}/error.log +CustomLog ${APACHE_LOG_DIR}/access.log combined +``` + + + +Activa el sitio y módulos necesarios: +sudo a2ensite nextcloud.conf +sudo a2enmod rewrite headers env dir mime +sudo systemctl reload apache2 + +Abre el navegador y escribe http://IP_DEL_SERVIDOR/nextcloud + +BACKUP nextcloud +sudo -E -u www-data php occ maintenance:mode --on +rsync -Aavx nextcloud/ nextcloud-dirbkp\_`date +"%Y%m%d"`/ +mysqldump --single-transaction --no-tablespaces -h [server] -u [username] -p[password] [db_name] > nextcloud-sqlbkp\_`date +"%Y%m%d"`.bak +mysqldump --single-transaction --default-character-set=utf8mb4 -h [server] -u [username] -p[password] [db_name] > nextcloud-sqlbkp\_`date +"%Y%m%d"`.bak +sudo -E -u www-data php occ maintenance:mode --off + +RESTORE nextcloud +rsync -Aax nextcloud-dirbkp/ nextcloud/ +mysql -h [server] -u [username] -p[password] -e "DROP DATABASE nextcloud" +mysql -h [server] -u [username] -p[password] -e "CREATE DATABASE nextcloud" + +utf8 +mysql -h [server] -u [username] -p[password] -e "DROP DATABASE nextcloud" +mysql -h [server] -u [username] -p[password] -e "CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" + +mysql -h [server] -u [username] -p[password] [db_name] < nextcloud-sqlbkp.bak + +Copiar archivos del servidor ubuntu a nextcloud +sudo cp -R /ruta/de/tus/archivos/* /var/www/nextcloud/data//files/Destino/ + +sudo -u www-data php /var/www/nextcloud/occ files:scan --path="/files/Destino" + +Nota para lo siguiente: Ha funcionado sin crear directorio destino ni dar permisos. +No copies archivos cuando el usuario esté accediendo a Nextcloud; podrías corromper datos. +Asegúrate de que el directorio de destino (Destino) exista previamente, o créalo con: +mkdir /var/www/nextcloud/data//files/Destino +chown -R www-data:www-data /var/www/nextcloud/data//files/Destino + +Eliminar bloqueos base de datos de Nextcloud +Nextcloud a veces deja bloqueos en la base de datos que impiden operaciones de archivos. +sudo mysql -u root -p +Selecciona base datos Nextcloud +USE nextcloud; +DELETE FROM oc_file_locks WHERE 1; +EXIT; + +--- + +**SOLUCION PROBLEMAS DNS-INTERNET DE CLOUDFLARE TUNNEL - TAILSCALE** + +Archivo que controla las dns es: + +/etc/resolv.conf + +Tiene que estar asi para que funcione dns de cloudflare: + +cat /etc/resolv.conf + +nameserver 1.1.1.1 + +nameserver 8.8.8.8 + +(reiniciar el servicio, a veces no necesario): + +sudo systemctl restart systemd-resolved + +Al arrancar tailsclale hay que indicar que no use las dns de tailscale, en la terminal o tambien en la consola web de tailscale donde salen todos los dipositivos que la utilizan, dejando que ubuntu server es el exit node: + +sudo tailscale up --accept-dns=false --advertise-exit-node + +--- + + +**UBUNTU SERVER ACCESOS** +192.168.18.235 + +ubuntu server     jesus / ??? +phpmyadmin    phpmyadmin / Password123! +mysql           admin / bitr2d2c3p0 + +WordPress          admin / bitr2d2c3p0 +            bd wordpress wpuser - Password123! +https://xiberus.com/wordpress/wp-admin + +Gitea            192.168.18.235:3000 +                  admin / Codibyte1@gitea + +Plex http://:32400/web + +Transmission     192.168.18.235:9091 +                   user: admin - Codibyte1@ + +nextcloud       192.168.18.235:9091/nextcloud +                 bd mysql +                 base:nextcloud user:nextclouduser pass:password123 +                    administrador - user:admin pass: bitr2d2c3p0 \ No newline at end of file diff --git a/Guia_vaultwarden.md b/Guia_vaultwarden.md new file mode 100644 index 0000000..00464bf --- /dev/null +++ b/Guia_vaultwarden.md @@ -0,0 +1,128 @@ +**Docker Compose** + +``` +services: + vaultwarden: + image: vaultwarden/server:latest + container_name: vaultwarden + restart: unless-stopped + environment: + DOMAIN: "https://vw.domain.tld" + volumes: + - ./vw-data/:/data/ + ports: + - 127.0.0.1:8000:80 +``` + +**Docker CLI** + +``` +docker pull vaultwarden/server:latest +docker run --detach --name vaultwarden \ + --env DOMAIN="https://vw.domain.tld" \ + --volume /vw-data/:/data/ \ + --restart unless-stopped \ + --publish 127.0.0.1:8000:80 \ + vaultwarden/server:latest +``` + +🔹 **backup** +cd /opt/vaultwarden +tar -czvf vaultwarden-backup-$(date +%F).tar.gz vw-data + +Or if you are using docker: +docker exec -it vaultwarden /vaultwarden backup + +🔹 **Restore** +sudo docker-compose down +rm -rf vw-data +tar -xzvf vaultwarden-backup-2025-09-15.tar.gz +sudo docker-compose up -d + +**🔹 Backup automático con cron** +crontab -e +0 3 * * * tar -czf /opt/vaultwarden/backups/vaultwarden-$(date +%F).tar.gz -C /opt/vaultwarden vw-data + +**🔹 backup.sh** +#!/bin/bash +### Backup de Vaultwarden +#### Carpeta de datos +DATA_DIR="/opt/vaultwarden/vw-data" +#### Carpeta de backups +BACKUP_DIR="/opt/vaultwarden/backups" +#### Crear carpeta de backups si no existe +mkdir -p "$BACKUP_DIR" +#### Nombre del archivo con fecha +BACKUP_FILE="$BACKUP_DIR/vaultwarden-$(date +%F-%H%M).tar.gz" +echo "📦 Creando backup en $BACKUP_FILE ..." +tar -czvf "$BACKUP_FILE" -C /opt/vaultwarden vw-data +echo "✅ Backup completado." + +**🔹 restore.sh** +#!/bin/bash +### Restaurar backup de Vaultwarden +DATA_DIR="/opt/vaultwarden/vw-data" +BACKUP_DIR="/opt/vaultwarden/backups" +if [ -z "$1" ]; then +echo "Uso: $0 archivo_backup.tar.gz" +exit 1 +fi +BACKUP_FILE="$1" +if [ ! -f "$BACKUP_FILE" ]; then +echo "❌ El archivo $BACKUP_FILE no existe." +exit 1 +fi +echo "🛑 Deteniendo contenedor..." +cd /opt/vaultwarden +sudo docker-compose down +echo "🗑️ Eliminando datos actuales..." +rm -rf "$DATA_DIR" +echo "📂 Restaurando desde $BACKUP_FILE ..." +tar -xzvf "$BACKUP_FILE" -C /opt/vaultwarden +echo "🚀 Iniciando contenedor..." +sudo docker-compose up -d +echo "✅ Restauración completada." + +--- + +**ejecutar backup sh** +chmod +x /opt/vaultwarden/backup.sh /opt/vaultwarden/restore.sh + +/opt/vaultwarden/backup.sh +/opt/vaultwarden/restore.sh /opt/vaultwarden/backups/vaultwarden-2025-09-15-1530.tar.gz + +--- + +**Añadir menu administrador:** +openssl rand -base64 48 - generar token mac/linux o (git bash windows) + +[Convert]::ToBase64String((1..48 | ForEach-Object {Get-Random -Maximum 256})) - generar token windows + +environment: +- ADMIN_TOKEN=pon_aqui_un_token_seguro + + + + +### Docker-Based Automated Backups (Example) +If you're using Vaultwarden via Docker and want to automate your backups to a remote machine, the following method might help. It stops the container to ensure consistency, zips the data directory, transfers it via scp, and then restarts Vaultwarden. + +**Backup Script Example:** + +#!/bin/bash +docker-compose down +datestamp=$(date +%m-%d-%Y) +backup_dir="/home//vw-backups" +zip -9 -r "${backup_dir}/${datestamp}.zip" /opt/vw-data* +scp -i ~/.ssh/id_rsa "${backup_dir}/${datestamp}.zip" user@:~/vw-backups/ +docker-compose up -d + +You can automate this via cron: +0 0 * * * /root/transfer_vaultwarden_logs.sh + +Cleanup Script (optional) to keep only the most recent backup: +#!/bin/bash +cd ~/backups || exit +find . -type f -name '*.zip' ! -mtime -1 -exec rm {} + +Always test restores. To restore, unzip the archive back into /opt/vw-data, replacing the previous data directory. + diff --git a/Guia_windows.md b/Guia_windows.md new file mode 100644 index 0000000..f359b64 --- /dev/null +++ b/Guia_windows.md @@ -0,0 +1,81 @@ +AYUDA WINDOWS + +\============= + + +INFORME ESTADO BATERIA + +powercfg /batteryreport /output C:\battery-report.html + +CAMBIAR LETRA DE UNIDAD (por ejemplo USB) con PowerShell (administrador) + +Get-Partition + +Set-Partition -DriveLetter X -NewDriveLetter Y + + +HABILITAR LA EJECUCION DE SCRIPTS PARA Powershell + +Para corregir la restricción que trae por defecto PowerShell para ejecutar Script en Windows: + +Abre la consola PowerShell como administrador y comprueba el error escribiendo «Get-ExecutionPolicy». Si al hacer clic en Enter la consola te devuelve : + +«Unrestricted», entonces tendrás que modificar la configuración + +Escribe en la consola «Set-ExecutionPolicy Unrestricted» y a continuación contesta con un "S" o "Y", para indicar que quieres modificarla. + + +VMWare PLAYER DISABLE SIDE-CHANNEL MITIGATIONS IN + +find the VMX file (virtual machine configuration file). Open that file in Notepad. + +Add the following line to the list of parameters: ulm.disableMitigations="TRUE". + +Save changes and close Notepad. + + +shutdown /s apagar equipo + +shutdown /r reiniciar + +shutdown /h hibernar + +hostname Nombre del equipo + +wmic bios get serialnumber Número serie equipo + +Limpieza de disco en Windows 11 + +ejecutar cleanmgr + +hosts windows + +C:\Windows\System32\drivers\etc\hosts + +WSL (window subsistem for linux) + +wsl --install (instala ubuntu por defecto) + +wsl --install -d Debian Instalar una distribución específica + +wsl --list --online Listar todas las distribuciones disponibles: + +Eliminar distribuciones instaladas + +wsl --list + +wsl --unregister Ubuntu Eliminar (ejemplo Ubuntu) + +Eliminar WSL desde Configuración (Opcional) + +Configuración → Aplicaciones → Características opcionales → Más características de Windows + +Desmarca: + +✔ Virtual Machine Platform + +✔ Windows Subsystem for Linux + +Reinicia el PC. + +