Instalar Pixelfed en Debian 11, sin morir en el intento

,


Entendiendo esta guia:

Estos son comandos:

ls -all

Esto es el contenido de un archivo:

<?php echo «hello world!» ?>

Estos son notas que deberás leer.


¿Qué es Pixelfed?

Pues Pixelfed es una aplicación/servicio similar a Instagram, pero a diferencia de Instagram, Pixelfed no esta centralizado, es libre y de código abierto

¿Qué significa que no esta centralizado?

Pues a diferencia de otros servicios y aplicaciones, Pixelfed esta descentralizado, no depende de una única entidad y cada instancia es única he independiente.
También cada instancia de Pixelfed puede interactuar con otras instancias, ya que utiliza protocolos abiertos.

Manos a la obra!

Paquetes necesarios

Antes de configurar todo instaláremos algunos paquetes necesarios para hacer funcionar todo, en lugar de instalarlos todos juntos, lo haremos de forma independiente para evitar cualquier problema.

Ejecutamos:

apt install git zip psmisc build-essential apache2 mariadb-server curl htop bmon mc pngquant optipng jpegoptim gifsicle ffmpeg redis 

Usuario de sistemas para Pixelfed

Crearemos un usuario para la aplicación, ejecutamos lo siguiente:

useradd pixelfed -m -d /www/pixelfed -s /bin/false -r -c "Pixelfed User"

Obtenemos una copia de Github

Para esto utilizaremos el usuario que ya creamos, ejecutamos:

su -l pixelfed -s /bin/bash ; cd

Y ejecutamos:

git clone -b dev https://github.com/pixelfed/pixelfed.git pixelfed

Deberemos ver algo asi:

Clonando en 'pixelfed'...
remote: Enumerating objects: 47808, done.
remote: Total 47808 (delta 0), reused 0 (delta 0), pack-reused 47808
Recibiendo objetos: 100% (47808/47808), 44.17 MiB | 13.14 MiB/s, listo.
Resolviendo deltas: 100% (30423/30423), listo.

(Mi sistema esta en español)


*Encontre un BUG!

Existe un bug en el codigo de la version » dev 0.11.4″, este se debe al cambio de version de Laravel de 8 a 9. Lo que ocasiona el BUG es que cuando se sube un archivo y se crean los directorios dentro de «storage», estos se creen con los permisos «0700», lo que evita que cualquier otro usuario que no sea el propietario del directorio, no pueda acceder al mismo. Para solventarlo he solicitado un PULL, en el repositorio de GitHUB #3825, lo que hace que el usuario con el que se ejecuta PHP al momento cree los directorios con los permisos correctos.

Para verificar si esto se ha corregido, editamos el archivo «pixelfed/config/filesystems.php».

Buscamos las lineas:

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root'   => storage_path('app'),
        ],

Agregamos la siguientes líneas (En rojo, si no están hay que agregarlas):

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root'   => storage_path('app'),
            'permissions' => [
                'file' => [
                    'public' => 0644,
                    'private' => 0644,
                ],
                'dir' => [
                    'public' => 0755,
                    'private' => 0755,
                ],
            ],

        'public' => [

Guardamos el archivo y continuamos.


Dejamos de utilizar el usuario «pixelfed» ejecutando:

exit

NOTA: Directorio de trabajo

El directorio de trabajo puede cambiar de acuerdo a cada uno y sus preferencias, en mi caso para las aplicaciones WEB y sitios WEB, prefiero instalar todo en un único directorio dentro del RAIZ del disco, en mi caso es el «/www» y las aplicaciones en un directorio con su respectivo nombre, en este caso «pixelfed».
Para ello ejecutamos este comando:

mkdir /www/pixelfed/ssl -p

«-p» esta opción creara los directorios padres si no existen.
«ssl» utilizaremos este directorio para guardar los certificados firmados por Let’s Encrypt.


Configurando Apache2

Configuraremos el apache web server, para que pueda acceder a «/www/pixelfed», por defecto el servicio de apache tiene permisos para trabajar en el directorio «/var/www/», cambiaremos esto para que el servicio pueda acceder a «www» (este es mi ejemplo, en tu caso puede ser el directorio que ).

Editamos el archivo «/etc/apache2/apache2.conf«. Buscamos las líneas:

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Podemos cambiarlas o agregar de bajo:

<Directory /www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Configuramos el Virtual Host

Dentro del directorio «/etc/apache2/sites-available» se almacenas las configuraciones de cada virtual host, crearemos una nueva configuración llamada «pixelfed.conf», por ejemplo.
Teniendo en cuenta que en este ejemplo utilizaremos el dominio «pixelfed.example.int» y el directorio de trabajo «/www/pixelfed/public», están cargados en todo en este ejemplo.
Creamos el archivo «/etc/apache2/sites-available/pixelfed.conf» Y agregamos lo siguiente:

<VirtualHost *:80>
    ServerName pixel.example.int
    ServerAdmin goxonline@arguos.com

    DocumentRoot /www/pixelfed/pixelfed/public
    LogLevel debug
    <Directory /www/pixelfed/pixelfed/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/pidexfed.error.log
    CustomLog ${APACHE_LOG_DIR}/pixelfed.access.log combined
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php.pixelfed.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Activamos el sitio ejecutando:

a2ensite pixelfed.conf 

Y reiniciamos el servicio de Apache:

service apache2 restart

Soporte para SSL

Este ejemplo de configuración es para el servicio sin SSL. Si necesitamos SSL, crearemos también el siguiente archivo de configuración «/etc/apache2/sites-available/ssl.pixelfed.conf» y agregaremos lo siguiente al archivo:

<VirtualHost *:443>
    ServerName pixelfed.example.int
    ServerAdmin goxonline@arguos.com

    DocumentRoot /www/pixelfed/pixelfed/public

    <Directory /www/pixelfed/pixelfed/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php.pixelfed.sock|fcgi://localhost"
    </FilesMatch>

    SSLCertificateFile /www/pixelfed/ssl/fullchain.cer
    SSLCertificateKeyFile /www/pixelfed/ssl/pixelfed.key
    Include /etc/apache2/conf-available/letsencrypt.conf

    ErrorLog ${APACHE_LOG_DIR}/ssl.pixelfed.error.log
    CustomLog ${APACHE_LOG_DIR}/ssl.pixelfed.access.log combined
</VirtualHost>

También creamos el archivo «/etc/apache2/conf-available/letsencrypt.conf» y agregamos al mismo:

SSLEngine on

# Intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
#SSLCipherSuite         HIGH:MEDIUM:!MD5!EXP:!NULL:!LOW:!ADH
#SSLCipherSuite         ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on
SSLCompression          off

SSLOptions +StrictRequire

Antes de activar esta configuración, solicitaremos la firma del certificado. Los pasos para hacer esto, están al final del documento.


Firmamos un certificado para nuestro dominio con ACME.SH

Descargaremos el cliente «acme.sh», pero se puede utilizar cualquier, yo estoy acostumbrado a este.
Puedes descargar el mismo desde aquí:

Release Normal release · acmesh-official/acme.sh · GitHub

Descomprimimos el «acme.sh» en el directorio que deseemos, dentro de este encontraremos el script «acme.sh». Psociblemente deberemos registrarnos, para esto ejecutamos:

./acme.sh --register-account --insecure --force --email test@test.com

Y luego firmamos el certificado para nuestro dominio:

./acme.sh --issue -d pixelfed.int -w /www/pixelfed/pixelfed/public --cert-file /www/pixelfed/ssl/pixelfed.int.cer \
--key-file /www/pixelfed/ssl/pixelfed.int.key --ca-file /www/pixelfed/ssl/ca.cer \
--fullchain-file /www/pixelfed/ssl/fullchain.cer --force

(Donde pixelfed.int deberá ser reemplazado por tu dominio)


Activaremos el Virtual Hosts en apache con el siguiente comando:

a2ensite ssl.pixelfed.conf

También activaremos los módulos «proxy» de Apache, estos los utilizaremos para pasar los archivos PHP desde el Apache y procesarlos. Tambien ectivaremos el modulo «Rewrite», el cual es necesario por Pixelfed. Ejecutamos el siguiente comando para activar los módulos:

a2enmod proxy* rewrite ssl 

Y reiniciamos el servicio Apache con el siguiente comando:

systemctl restart apache2

PHP 8.1

Agregamos el repositorio PHP alternativo

Repositorio: Para poder instalar PHP 8.1 utilizaremos los paquetes de https://deb.sury.org. Para ello ejecutaremos los siguientes pasos:

apt install apt-transport-https lsb-release ca-certificates

wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

apt update 

Instalamos PHP 8.1 con el siguiente comando (El repositorio tiene varias versiones de PHP, por lo que especificamos la versión que necesitamos ):

apt-get install php8.1-fpm php8.1 php8.1-common php8.1-cli php8.1-gd php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-pgsql php8.1-curl php8.1-xml php8.1-xmlrpc php8.1-imagick php8.1-gd php8.1-mysql php8.1-cli php8.1-intl php8.1-zip php8.1-redis 

Configuramos el PHP FPM

Crearemos un nuevo «pool» de PHP para nuestro sitio WEB. Para esto crearemos el archivo «/etc/php/8.1/fpm/pool.d/pixelfed.conf» y agregaremos el siguiente contenido:

[pixelfed]
user = pixelfed
group = pixelfed
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
listen = /var/run/php.pixelfed.sock
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 20

chdir = /www/pixelfed

php_flag[display_errors] = on
php_admin_value[error_log] = /www/pixelfed/php.error.log

php_admin_flag[log_errors] = on

php_admin_value[open_basedir] = /www/pixelfed:/usr/share/:/tmp:/var/lib/php

Modificamos el php.ini

Editamos el archivo «/etc/php/8.1/fpm/php.ini», buscamos la entrada «upload_max_filesize = 2M» y la modificamos por:

upload_max_filesize = 20M

(20 Megas es suficiente, este es el parámetro que indica el tamaño máximo que puede tener un archivo. Si quieres subir videos a tu instancia, este numero deberá ser mayor)

Buscamos la entrada «post_max_size = 8M» y la modificamos:

post_max_size = 20M

(Deberá tener el mismo valor que «upload_max_filesize»).

Salvamos el archivo y continuamos reiniciando servicio de PHP-FPM con el siguiente comando:

service php8.1-fpm restart

Si no hay errores, verificamos con el siguiente comando que este en ejecucion el php:

pstree -cupa | grep php

Deberemos ver algo asi:

  |-php-fpm8.1,1392
  |   |-php-fpm8.1,1397,www-data
  |   |-php-fpm8.1,1398,www-data
  |   |-php-fpm8.1,1393,pixelfed
  |   |-php-fpm8.1,1394,pixelfed
  |   |-php-fpm8.1,1395,pixelfed
  |   `-php-fpm8.1,1396,pixelfed
  |           |-grep,1405 php

Creamos una base de datos MySQL

Crearemos una base de datos para Pixelfed llamada «pixelfed» (Pero puedes crear la que desees). Para esto como el usuario «root» ingresamos a mysql, no deberá solicitar clave, ya que MariaDB, no la solicita para el usuario de sistemas «root»:

:~# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 30
Server version: 10.5.15-MariaDB-0+deb11u1 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Una ves dentro del cliente MySQL, ejecutamos la siguiente sentencia para crear la base de datos:

CREATE DATABASE pixelfed ;

Ahora crearemos un usuario para la aplicación que tenga permisos para trabajar en esta base de datos.

GRANT ALL ON pixelfed.* TO pixelfed@localhost IDENTIFIED BY 'the_secure_password';

Tener en cuenta que «the_secure_password» debe ser cambiado por una contraseña un poco mas segura.

Para salir de cliente MySQL, pueden escribir «exit;».cd /

Instalamor PHP Composer

Ejecutamos lo siguiente para instalar el paquete PHP composer:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

php composer-setup.php

php -r "unlink('composer-setup.php');"

Movemos el paquete para finalizar:

mv composer.phar /usr/local/bin/composer

Terminamos de configurar Pixelfed

Utilizamos el usuario «pixelfed» nuevamente, ejecutando:

su -l pixelfed -s /bin/bash ; cd

Verificamos los permisos de los directorios y los archivos, ejecutamos:

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Esto corregirá cualquier error en los permisos de los archivos y directorios que no esta contemplado el Github.

Instalamos las dependencias

(Aun con el usuario pixelfed)

cd /www/pixelfed/pixelfed ; composer install --no-ansi --no-interaction --optimize-autoloader


Nota: Es posible que tambien necesitemos actualizar alguna dependencia, esto se puede hacer ejecutando dentro del directorio «/www/pixelfed/pixelfed» el siguiente comando:

composer update

Veremos algo asi:

Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 181 installs, 0 updates, 0 removals
  - Downloading aws/aws-crt-php (v1.0.2)
  - Downloading dasprid/enum (1.0.3)
  - Downloading bacon/bacon-qr-code (2.0.7)
  - Downloading symfony/polyfill-mbstring (v1.26.0)
  - Downloading symfony/deprecation-contracts (v3.1.1)
  - Downloading symfony/http-foundation (v6.1.7)
  - Downloading psr/http-message (1.0.1)

Copiamos en archivo de variables de entorno:

cp .env.example .env

En este archivo podemos cambiar las variables de la configuración de la aplicación, para este ejemplo nos interesan las siguientes líneas:

APP_NAME="Pixelfed"
APP_ENV="production"
APP_KEY=                                                                                                                                                                                                                                     APP_DEBUG="false"

# Instance Configuration
OPEN_REGISTRATION="false"
ENFORCE_EMAIL_VERIFICATION="false"
PF_MAX_USERS="1000"

# Instance URL Configuration
APP_URL="http://pixelfed.int"
APP_DOMAIN="pixelfed.int"
ADMIN_DOMAIN="pixelfed.int"
SESSION_DOMAIN="pixelfed"

# Database Configuration
DB_CONNECTION="mysql"
DB_HOST="127.0.0.1"
DB_PORT="3306"
DB_DATABASE="pixelfed"
DB_USERNAME="pixelfed"
DB_PASSWORD="the_secure_password"
                                                                                                                                                                                                                                                                                                                                                                                                                                                                # ActivityPub Configuration                                                                                                                                                                                                                  ACTIVITY_PUB="true"                                                                                                                                                                                                                         AP_REMOTE_FOLLOW="true"                                                                                                                                                                                                                     AP_INBOX="true"                                                                                                                                                                                                                             AP_OUTBOX="true"                                                                                                                                                                                                                            AP_SHAREDINBOX="true"

Guardamos y preseguimos.

Ejecución de solo un paso

Estos comandos lo debemos ejecutar con el usuario «pixelfed», dentro de la carpeta «pixelfed»:

su -l pixelfed -s /bin/bash; cd ; cd pixelfed

Ejecuta estos comandos uno, por uno, en caso de error habrá que investigarlo.

php artisan key:generate
php artisan storage:link
php artisan migrate --force
php artisan import:cities
php artisan instance:actor
php artisan passport:keys
php artisan route:cache
php artisan view:cache
php artisan config:cache

Si todo ha ido bien y no tienes errores, pues puedes crear el servicio, esto deberas hacerlo como el usuario «root».

Crearemos el archivo «/etc/systemd/system/pixelfed.service» con el siguiente contenido:

[Unit]
Description=Pixelfed task queueing via Laravel Horizon
After=network.target
Requires=mariadb
Requires=php-fpm
Requires=redis
Requires=apache

[Service]
Type=simple
ExecStart=/usr/bin/php /www/pixelfed/pixelfed/artisan horizon
User=pixelfed
Restart=on-failure

[Install]
WantedBy=multi-user.target

Habilitamos el servicio con en el systemd con el siguiente comando:

systemctl enable --now pixelfed

Por ultimo como el usuario «pixelfed», crearemos un usuario y agregaremos una en el crontab.

Primero agregamos el usuario ejecutando lo siguiguiente:

php artisan user:create

Nos solicitara algunos datos, como si lo queremos hacer administrador y si deseamos verificar su email manualmente, responderemos que si a todo:

Creating a new user...

 Name:
 > Gonzalo

 Username:
 > goxonline

 Email:
 > goxonline@gmail.com

 Password:
 >*******

 Confirm Password:
 >*******

 Make this user an admin? (yes/no) [no]:
 > yes

 Manually verify email address? (yes/no) [no]:
 > yes

 Are you sure you want to create this user? (yes/no) [no]:
 > yes

Created new user!

Agregamos al crontab ejecutando «crontab -e», la siguiente entrada:

* * * * * /usr/bin/php /www/pixelfed/pixelfed/artisan schedule:run >> /dev/null 2>&1

Si todo va bien, ingresa en un navegador a tu dominio, y deberás ver esto:

Pixelfed fresh install home page.
Pagina de inicio de Pixelfed

Y listo!
Cualquier problemas que encuentres, pues déjame un comentario!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *