Ok, un rápido resumen.
Estoy colaborando en la migración de un foro que actualmente está en vbulletin3.
En un entorno de staging, partiendo de un volcado de la base de datos (20 GB, sí, has leído bien).
Ejecuté la actualización a vBulletin 5. Tardó 5-6 horas pero se completó. La versión es vBulletin 5.4.
Hice una limpieza de los nombres de usuario para que fueran aceptados por discourse.
Ahora, instalé docker discourse y seguí de forma general esta guía para la preparación. De forma general significa que la mayor parte era redundante o estaba desactualizada, pero ayudó a tener una idea de qué hacer.
Estoy en el paso en el que literalmente me estoy quedando ciego, ya que tengo casi cero experiencia en codificación Ruby.
Así que, las partes relevantes, después de terminar la instalación, entré en el contenedor con ./launcher enter app y luego:
- Añadí
freetds-devylibmariadb-dev. - Edité el Gemfile para añadir el gem
php_serialize. - Desde la shell, ejecuté
export IMPORT=1para establecer el entorno de importación. - Como usuario
discourse, ejecutébundle install --no-deployment --without test --without development --path vendor/bundle.
Obtuve el error:
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.
If this is a development machine, remove the /var/www/discourse/Gemfile freeze
by running `bundle config unset deployment`.
The list of sources changed
The dependencies in your gemfile changed
You have added to the Gemfile:
* mysql2
* redcarpet
* php_serialize
* sqlite3 (~> 1.3, >= 1.3.13)
* ruby-bbcode-to-md
* reverse_markdown
* tiny_tds
* csv
* parallel
Así que, continué con:
bundle config unset deploymenty volví a ejecutar el comando anterior.- Comprobé que tanto
mysql2comophp_serializeestaban presentes (lo estaban). - Añadí los avatares antiguos del foro (sin adjuntos que importar) y asigné la propiedad de los directorios al usuario
discourseen su propio/home/discourse. - Edité
script/import_scripts/vbulletin5.rbpara cambiar la referencia de conexión a la base de datos. - Como usuario
discourse, ejecutébundle exec ruby script/import_scripts/vbulletin5.rb.
Esto me devolvió un error sobre tzinfo Integer values not supported que encontré mencionado aquí en este discourse.
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing groups...
41 / 41 (100.0%) [2294 items/min] ]
importing users
Traceback (most recent call last):
15: from script/import_scripts/vbulletin5.rb:726:in `<main>'
14: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
13: from script/import_scripts/vbulletin5.rb:46:in `execute'
12: from script/import_scripts/vbulletin5.rb:79:in `import_users'
11: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
10: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
9: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
8: from script/import_scripts/vbulletin5.rb:98:in `block in import_users'
7: from /var/www/discourse/script/import_scripts/base.rb:264:in `create_users'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
4: from /var/www/discourse/script/import_scripts/base.rb:265:in `block in create_users'
3: from script/import_scripts/vbulletin5.rb:110:in `block (2 levels) in import_users'
2: from script/import_scripts/vbulletin5.rb:718:in `parse_timestamp'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.5/lib/tzinfo/timezone.rb:575:in `utc_to_local'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.5/lib/tzinfo/timestamp.rb:138:in `for': Integer values are not supported (ArgumentError)
La sugerencia de @Haddoq fue cambiar una línea de Time.zone.at(@tz.utc_to_local(timestamp)) a Time.zone.at(timestamp).
También sugiere añadir lastvisit en la consulta de usuario porque de lo contrario causará otro error, así que lo hice también.
Sin embargo, ahora cuando lanzo la migración con bundle exec ruby script/import_scripts/vbulletin5.rb esto es lo que obtengo:
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing groups...
41 / 41 (100.0%) [120217 items/min]
importing users
Traceback (most recent call last):
13: from script/import_scripts/vbulletin5.rb:727:in `<main>'
12: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
11: from script/import_scripts/vbulletin5.rb:46:in `execute'
10: from script/import_scripts/vbulletin5.rb:79:in `import_users'
9: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
8: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
7: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
6: from script/import_scripts/vbulletin5.rb:80:in `block in import_users'
5: from script/import_scripts/vbulletin5.rb:723:in `mysql_query'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:22:in `query'
3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `query'
2: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `handle_interrupt'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `block in query'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `_query': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CASE WHEN u.scheme='blowfish:10' THEN token (Mysql2::Error)
WHEN u.scheme='lega' at line 2
En este punto estoy un poco perdido. ¿Alguien puede ayudar?

