spla

Python

Ja tenim acabat i funcionant a plena satisfacció el nostre programa #Python i ens agradaria compartir-lo a PyPi, l'index universal de paquets Python. Tenir-lo allà permet que qualsevol persona que el vulgui instal·lar en el seu ordinador o servidor només li caldrà fer el famós pip install nom_del_paquet.

Estructura

El que cal fer és tenir tots els fitxers necessaris per a executar-lo dins d'un sub directori. Com a exemple utilitzaré el cas real del meu Python wrapper for Akkoma API.

.
├── akkoma
│   ├── Akkoma.py
│   ├── __init__.py
├── LICENSE
├── README.md
├── setup.py
├── tests  

En el sub directori akkoma hi hem de tenir tant el codi que hem programat (el fitxer Akkoma.py) com __init__.py, que serveix per a que Python tracti aquest sub directori com un contenidor de paquets si __init__.py és un arxiu buid o aprofitar-lo per a inicialitzar el nostre programa. Per a no fer massa complexe aquesta entrada recomano llegir aquest enllaç per a entendre millor aquests conceptes.
Hi tenim un altre sub directori, test, que per ara el podem deixar buit. En l'arrel del projecte cal tenir la llicència que li vulguem posar (LICENSE), el inevitable README.md on expliquem com funciona el nostre programa i setup.py, molt important perquè descriu el paquet, diu a setuptools com construir-lo, com pujar-lo a PyPi i què es mostrarà allà.

setup.py

El rovell de l'ou. Aquest és el setup.py real que he utilitzat:

import setuptools

VERSION = '0.1.6'

with open('README.md', 'r', encoding='utf-8') as fh:
    long_description = fh.read()

setuptools.setup(
    name='Akkoma.py',
    version=VERSION,
    author='el_nostre_usuari_a_PyPi',
    author_email='adreça@correu.cat',
    description='Python wrapper for the [Akkoma](https://akkoma.dev/AkkomaGang/akkoma) API.',
    packages=['akkoma'],
    long_description=long_description,
    long_description_content_type='text/markdown',
    url='https://git.mastodont.cat/spla/Akkoma.py',
    install_requires=['pytz', 'requests', 'python-dateutil', 'decorator'],
    project_urls={
        'Bug Tracker': 'https://git.mastodont.cat/spla/Akkoma.py/issues',
    },
    keywords='akkoma api microblogging',
    classifiers=[
        "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
        "Topic :: Software Development :: Libraries :: Python Modules",
        "Topic :: Communications",
        "Intended Audience :: Developers",
        'Programming Language :: Python :: 3',
    ],
    python_requires = ">=3.8",
)  

La primera línia importa el mòdul setuptools (imprescindible per a construir el paquet). Definim la versió que li volem donar en la segona línia amb VERSION. La tercera obté el contingut de README.md que és el que es mostrarà a PyPi. setuptools.setup descriu el paquet, l'autor, la pàgina del projecte (recomanable tenir un repositori git i posar aquí les urls al mateix), els mòduls que necessitarà el nostre paquet per a executar-se (la línia install_requires), les paraules clau amb keywords (que venen a ser com els hashtags), ón es classifica el projecte amb classifiers (la llista sencera dels que podem usar és aquí) i quina versió de #Python cal per a executar el paquet amb python_requires (en aquest cas ha de ser igual o major a la versió 3.8).
Abans de construir el paquet i pujar-lo a PyPi cal que ens hi registrem. Quan ja tenim el registre fet ja ho tenim tot per a construir el paquet!

Construir el paquet

És tant fàcil com executar això en el directori arrel del projecte:

python -m build

Si no tenim instal·lat el mòdul build donarà un error. Cap problema!

pip install build  

I tornem a executar python -m build. Al final de moltes línies que ens mostrarà el constructor, veurem una línia final que diu:

Successfully built Akkoma.py-0.1.6.tar.gz and Akkoma.py-0.1.6-py3-none-any.whl

Perfecte! Tot llest per a pujar-lo a PyPi. Però un moment, primer ens cal el mòdul twine que facilita molt la tasca:

pip install twine

Ara sí:

python -m twine upload dist/*

Ens demanarà l'usuari i contrasenya de PyPi (ens hi hem registrat abans). Si tot va bé, ens donarà el missatge final on diu la URL del nostre paquet a PyPi i ja tindrem el primer paquet a l'abast de tot el món pythonista mundial.

Instal·lar #Mastodon en una #Raspberry Pi 4B amb 4 o 8 GB de RAM, primera part

El sistema operatiu de la meva Raspberry és Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-1021-raspi aarch64). Aquests passos funcionen perfectament en totes les Raspberry que corrin el mateix sistema operatiu però haurien de servir també per a les que utilitzin Raspbian. Si el teu sistema operatiu no és Ubuntu el pots instal·lar seguint les instruccions oficials adients.

Cal comentar abans de començar que per a poder instal·lar Mastodon ens calen, com a mínim, 4GB de RAM. El motiu és que amb menys RAM no podrem compilar els assets de Mastodon. Ho sé perquè vaig voler provar-ho en la 3B+ que només té 1GB de RAM...

Servei DDNS

Per a que el servidor Mastodon que volem instal·lar federi amb el #fedivers ens cal crear un compte en un servei DDNS. Un dels molts que hi ha que té certa fama i permet actualitzar la IP pública via la seva API és Dynu {d}DNS. Creem un compte en l'enllaç anterior i en la secció Dynamic DNS Service premem el botó + Add. En el camp Host de Option 1: Use Our Domain Name hi escribim el subdomini que vulguem, en el meu cas he posat mamut, i després triem el domini dels que hi ha disponibles a Top Level, en el meu cas freeddns.org. Acabem prement el botó Add de sota. Ja tenim un nom de domini per el nostre Mastodon! Per tot aquest tutorial serà mamut.freeddns.org.

IP dinàmica, IP pública

El més segur és que a casa tinguem IP dinàmica. Per a que la resta de servidors del fedivers ens puguin trobar hem de actualitzar el servei DDNS amb la IP pública (la IP dinàmica que ens assigna el nostre proveidor d'Internet).
Dynu {d}DNS permet fer-ho mitjançant la seva #API, Genial, m'agrada molt #Python i programar el meu propi codi. Dit i fet, si seguim els pasos del meu repositori dynuapi tindrem la Raspberry enviant cada 30 minuts la seva IP pública al servei DDNS.
Abans de fer-ho, ens cal saber quina és la API-Key del nostre compte a Dynu {d}DNS. La tenim en la secció API Credentials del panel de control. Ens cal perquè dynuapi ens la demanarà.

Port forwarding

Cal redirigir els ports 80 i 443 del router principal de casa cap a la IP local de la Raspberry. En la secció Port forwarding del tutorial de Akkoma explico com es fa.

Requisits de Mastodon

Aquest tutorial està basat en la documentació oficial.

Com a root instal·lem els següents paquets del sistema operatiu:

apt install -y curl wget gnupg apt-transport-https lsb-release ca-certificates

També ens cal Node.js:

curl -sL https://deb.nodesource.com/setup_16.x | bash -
apt-get install -y nodejs

I els paquets següents:

apt install -y \
imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core \ g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \
bison build-essential libssl-dev libyaml-dev libreadline6-dev \
zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \
nginx redis-server redis-tools postgresql postgresql-contrib \
certbot python3-certbot-nginx libidn11-dev libicu-dev libjemalloc-dev

Yarn

Executem aquestes dues línies:

corepack enable
yarn set version classic

Ruby

Primer afegim l'usuari mastodon:

adduser --disabled-login mastodon

I canviem a ell:

su - mastodon

Mastodon necessita Ruby, executem aquestes sis línies una a una:

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec bash
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

Ara ja podem instal.lar la versió de Ruby correcte:

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.0.4

I fem que sigui global:

rbenv global 3.0.4

Necessitem el primer 'gem' bundler:

gem install bundler --no-document

Tornem al usuari root:

exit

Postgresql

Hem de crear l'usuari/rol mastodon a Postgresql:

sudo -u postgres psql

I en el prompt creem l'usuari:

CREATE USER mastodon CREATEDB;

Ja podem sortir:

\q

I tornem al usuari mastodon:

su - mastodon

Clonar Mastodon

Instal·lem (clonem) Mastodon des d'el repositori oficial al directori local live i hi entrem:

git clone https://github.com/mastodon/mastodon.git live && cd live

La darrera versió estable:

git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

Les darreres dependències de Ruby i JavaScript, línia a línia:

bundle config deployment 'true'
bundle config without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)
yarn install --pure-lockfile

Configurarem Mastodon en la segona part.