a year ago
Hi, sorry, I have a question. I want to upload a project to Railway that I have in a repository. Inside the repository, I have a container where I have the database, and that generates another one where I have the project. I'm new to Docker, so I'm not sure how it works exactly, but I know that I run 'sudo docker compose up -d' and it generates 2 containers. Then, inside the container, I have to run some Laravel-specific commands. My question is how to do this with Railway
0 Replies
a year ago
please share the compose file and all the commands you need to run and where
i have these files
when i clone the commands are
sudo docker compose up -d
that generates 2 dockers, pgscomputacion and scomputacion-1
sudo docker exec -it scomputacion-1 bash
and then
compose install
a year ago
well first off, your dockerfile should be doing compose install
a year ago
do it in your dockerfile
a year ago
via RUN
a year ago
you'd do all the artisan stuff in the dockerfile too, and you might not need chown at all
a year ago
you should not be doing multiple updates and installs, condense all apt stuff into a single command
Oh, one more thing I also do BEFORE the php artisan commands is cp .env.example .env and in the .env file I set dbhost=pgscomputacion, dbport=5432, dbdatabase=taller, dbuser=postgres, db_password=postgres
a year ago
yeah that's looking much better, but since you need the database variables in the dockerfile you need to reference them in the dockerfile with ARG
a year ago
you'd set those in your service variables
a year ago
you had it right in the first screenshot, you dont need the ENV stuff
a year ago
does your app need postgres 14? would 16 work?
I really don't know… It should work, I just use Laravel's eloquent for relationships and create/delete records, nothing complicated
a year ago
okay then cant hurt to try 16
a year ago
do you already have a railway project?
a year ago
well then lets walk through the steps
a year ago
create an empty project and name it
a year ago
and please send screenshots at every step of the way
a year ago
nope, we hardly ever want to do that
a year ago
an empty project
please make sure to carefully read my messages
a year ago
add a postgres database
a year ago
create a new empty service
a year ago
name it and deploy it
a year ago
can you copy and paste the ARGs you have in your dockerfile for me
a year ago
open up your service's raw editor and paste this in -
DB_HOST=${{Postgres.PGHOST}}
DB_PORT=${{Postgres.PGPORT}}
DB_DATABASE=${{Postgres.PGDATABASE}}
DB_USERNAME=${{Postgres.PGUSER}}
DB_PASSWORD=${{Postgres.PGPASSWORD}}
and then deploy it
a year ago
and just this once no screenshot, click their eye icons to make sure they all show properly
a year ago
did you have any other environment variables that you need to set for it?
APPNAME=Laravel APPENV=local
APPKEY=base64:NP+/oB4Sc1mx4ISoyM6LECEJoLn2/gmQD9oe1zF8hwc= APPDEBUG=true
APP_URL=http://localhost
LOGCHANNEL=stack LOGDEPRECATIONSCHANNEL=null LOGLEVEL=debug
DBCONNECTION=pgsql DBHOST=pgscomputacion
DBPORT=5432 DBDATABASE=taller
DBUSERNAME=postgres DBPASSWORD=postgres
BROADCASTDRIVER=log CACHEDRIVER=file
FILESYSTEMDISK=local QUEUECONNECTION=sync
SESSIONDRIVER=file SESSIONLIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDISHOST=127.0.0.1 REDISPASSWORD=null
REDIS_PORT=6379
MAILMAILER=smtp MAILHOST=mailpit
MAILPORT=1025 MAILUSERNAME=null
MAILPASSWORD=null MAILENCRYPTION=null
MAILFROMADDRESS="hello@example.com"
MAILFROMNAME="${APP_NAME}"
AWSACCESSKEYID= AWSSECRETACCESSKEY=
AWSDEFAULTREGION=us-east-1
AWSBUCKET= AWSUSEPATHSTYLE_ENDPOINT=false
PUSHERAPPID=
PUSHERAPPKEY=
PUSHERAPPSECRET=
PUSHERHOST= PUSHERPORT=443
PUSHERSCHEME=https PUSHERAPP_CLUSTER=mt1
VITEAPPNAME="${APPNAME}" VITEPUSHERAPPKEY="${PUSHERAPPKEY}"
VITEPUSHERHOST="${PUSHERHOST}" VITEPUSHERPORT="${PUSHERPORT}"
VITEPUSHERSCHEME="${PUSHERSCHEME}" VITEPUSHERAPPCLUSTER="${PUSHERAPPCLUSTER}"
a year ago
well add everything that is necessary to your service variables
a year ago
but the syntax changes from ${PUSHER_HOST}
to ${{PUSHER_HOST}}
a year ago
yes
VITEAPPNAME="${{APPNAME}}" VITEPUSHERAPPKEY="${{PUSHERAPPKEY}}"
VITEPUSHERHOST="${{PUSHERHOST}}" VITEPUSHERPORT="${{PUSHERPORT}}"
VITEPUSHERSCHEME="${{PUSHERSCHEME}}" VITEPUSHERAPPCLUSTER="${{PUSHERAPPCLUSTER}}"
a year ago
yep, no quotes though
a year ago
but ${{APP_NAME}}
isnt going to do anything unless you have also set APP_NAME
as well
a year ago
and always make sure you check them with the eye icon
I don't know, I didn't touch any of that, just the db stuff and nothing else, I left everything else as is
a year ago
awsome
a year ago
now set PORT=80
a year ago
go into its settings and generate a domain
a year ago
and i assume you have the dockerfile and your app in a repo right?
a year ago
okay then go ahead and connect your repo
a year ago
yep
a year ago
deploy
a year ago
let me know how that goes
a year ago
we shall wait
a year ago
build logs please -
a year ago
use the bookmarklet please
a year ago
to the bookmarks bar
a year ago
you will want to enable the bookmarks bar
a year ago
your dockerfile needs to also install the composer cli before running the composer command
a year ago
i dont know php and the php eco system, so you tell me lol, is that how you install composer?
I really don't know hahaha I don't know about this myself, they gave me a container made and I only did everything in Laravel hahaha
a year ago
it would definitly be beneficial to learn the php ecosystem
a year ago
sounds good
a year ago
yeah push your changes to github
a year ago
Composer could not find a composer.json file in /var/www/scomputacion
Sure. The composer.json file is inside the src folder, but I run composer install from inside the container, after having run sudo docker exec -it scomputacion-1 bash
a year ago
please make sure you have the composer.json file in the correct location
a year ago
yep i saw, please make sure you have the composer.json file in the correct location
I mean, whenever I raised the project it was there and I had no problem. In my local project it is there
a year ago
then you are in the wrong working directory in your dockerfile
but there is one thing I don't understand, railway creates the containers? or how does that work?
a year ago
railway builds and runs the container, but your dockerfile defines how the container is built
a year ago
building the docker container is easier than letting railway do it if you have the means to do that
a year ago
same thing
a year ago
maybe your dockerfile runs that command in the wrong directory
a year ago
read the docs section I linked
i read it but i dont understand.
Look, the old dockerfile works correctly, but the new doesnt
i mean, the old dockerfile doesnt have the run composer install comand, but the route is supposed to be the same
a year ago
you can't assume it's going to work the same when you aren't using docker compose, and you don't have ssh into the container so you need to set everything up beforehand in your dockerfile
FROM php:8.2-apache
Define las variables de entorno para la base de datos usando ARG
ARG DBHOST ARG DBPORT
ARG DBDATABASE ARG DBUSERNAME
ARG DB_PASSWORD
Instala las dependencias necesarias para Laravel
RUN apt-get update && apt-get install -y \
libzip-dev \
zip \
unzip \
git \
zlib1g-dev \
libpng-dev \
libpq-dev \
libicu-dev \
libxslt1-dev \
g++ \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libxml2-dev \
librabbitmq-dev \
libssh-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
Instala Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Copia el código de tu aplicación Laravel al directorio /var/www/html
COPY src /var/www/scomputacion
Configura el directorio de trabajo
WORKDIR /var/www/scomputacion
Copia el archivo composer.json
COPY src/composer.json /var/www/scomputacion/composer.json
Instala extensiones de PHP
RUN docker-php-ext-install zip pdomysql gd pdopgsql intl xsl opcache mysqli pdo pdo_mysql soap
Instala APCu
RUN pecl install apcu && docker-php-ext-enable apcu
Instala extensiones adicionales
RUN pecl install amqp && docker-php-ext-enable amqp
Configura Apache
RUN a2enmod rewrite
Ejecutar composer install
RUN composer install
Ejecutar comandos de Artisan de Laravel
RUN php artisan migrate:fresh --seed
RUN php artisan key:generate
RUN php artisan optimize:clear
Expone el puerto 80 para que puedas acceder a la aplicación desde tu navegador
EXPOSE 80
Inicia Apache cuando se inicia el contenedor
CMD ["apache2-foreground"]
a year ago
make sure you enclose code in triple back ticks
a year ago
now try on railway
a year ago
what even is pecl?
RUN pecl install apcu installs the APCu extension using the pecl package manager.
RUN docker-php-ext-enable apcu enables the installed APCu extension within the PHP environment inside the Docker container.
a year ago
it's going to be quite difficult to deploy your app if you aren't familiar with the technologies involved
a year ago
I would recommend getting familiar with all the technologies involved, because I don't know php so I'm only able to really help with the railway side of things
At work, I was given this container to develop something in Laravel that is still in progress. Simultaneously, I started working on this project, and at work, they recommended that I use the same container since I was also going to use Laravel, but I don't know what it has. I just spun up the project and programmed
but I'm not in charge of uploading to production so I don't know what the procedure is like, I only program, I did this on my own that's why I don't know how to take it to production
a year ago
just learning the language can only get you so far, i can not express how important it is to know the ecosystem too
a year ago
but with that said, i think your last error might not be your doing, i just saw someone else get the exact same error and i know their deployment was working before
a year ago
try re-deploying, Google might have had some network troubles
a year ago
check out this link
a year ago
it shouldn't wipe anything, but as always with uncertainty make sure to check that yourself
a year ago
can you show me the code that connects to the database?
Laravel does that, it is not done manually, you just put the data in the .env
a year ago
but you still define the variables laravel uses in code, dont you?
a year ago
i figured it was something like that
a year ago
unoptimized dockerfile most likely
a year ago
looks like you ran into the build time limit of the trial plan
a year ago
>> RUN pecl install amqp && docker-php-ext-enable amqp
No releases available for package "pecl.php.net/amqp"
install failed
try to do docker compose up -d locally and it throws that error. From what I saw, it is normal because the database is not created until the container that has Postgres is finished being created. But on railway there should not be this problem
a year ago
yeah because it didnt get to that stage yet
a year ago
gotcha
a year ago
but it didnt on railway, meaning there is an issue with your dockerfile
a year ago
^
But how can it be that this line operates locally and not on the railway? It is not a dockerfile problem because it works for me
a year ago
im sorry but working locally does not mean its a platform issue
a year ago
^
a year ago
i think we should pick this back up when you are more familiar with the php ecosystem, im sorry i couldnt help you further
From what I see the problem is that you cannot run the php artisan from there
a year ago
its due to a config issue, im sorry as i dont know php my usefulness has ran out
but there is no way to throw those commands after the build has finished? like a railway console
a year ago
you can do it in your start command sure
a year ago
well you can't just delete them
a year ago
this is why i suggested coming back to this when you are more familiar with the php eco system
a year ago
any variable you use during build needs to be referenced with ARG
a year ago
and now your database is likely not migrated
php artisan are exclusive Laravel commands, they are for executing internal commands. They can be done at any time. At any time I run the php artisan migrate and it generates the database, it does not have to be with the creation of the project
a year ago
but railway does not provide ssh
a year ago
there is no such thing
a year ago
you can use railway run
but that only runs the command locally with the service variables available
a year ago
your best options are to run them in the dockerfile or in the start command
a year ago
you arent using nixpacks
a year ago
it was not my suggestion to use nixpacks
a year ago
maybe you have forgotten to use an ARG
a year ago
^
a year ago
^
a year ago
file_get_contents(/var/www/scomputacion/.env): Failed to open stream: No such file or directory
a year ago
i think it would be beneficial if you where to also look at the build logs when something fails
I see them from the page but from that file I can't find where the error is reported
chown -R www-data:www-data /var/www/scomputacion/public
chown -R www-data:www-data /var/www/scomputacion/storage/ /var/www/scomputacion/bootstrap/
ln -s /var/www/scomputacion/public /var/www/html
I think I should add that to the dockerfile as well.
a year ago
your code should not be trying to load a .env file
Now I had a problem, I tried to raise it again but it won't let me because the tables are trying to be created again because in the previous deployement that line worked, how can I delete the database?
a year ago
you would need to have the migration command do nothing if the migrations have already been ran
Ok, but one question I have. Does the system have to stay on all the time? That is, it never stops? I thought you could choose to turn it off and on whenever you want, but if every time I turn it on it has to generate the dockerfile I think it will be a problem
a year ago
you want app sleeping?
The app is probably used once a week, to upload orders. We want to do a one-month trial to check that the system works correctly but the free trial does not allow you to have the system running for the entire month, the monthly hours are limited, we thought it could be turned off and on so that it does not consume hours
a year ago
theres no hour limit on the trial plan??
a year ago
the only limit is the amount of resources and the trial credits you got
So I was misinformed. I had read that you could only keep it on a certain number of hours per month.
a year ago
indeed, no time limit, only credit and resource limit
a year ago
but you could run out of resources before the end of the month, i dont know how much resources your app and database will use
I have to put the permission commands. In theory it worked but that's what I get
a year ago
put them in the start command then
i put this #Permisoschown -R www-data:www-data /var/www/scomputacion/public
RUN chown -R www-data:www-data /var/www/scomputacion/public
RUN chown -R www-data:www-data /var/www/scomputacion/storage/ /var/www/scomputacion/bootstrap/
RUN ln -s /var/www/scomputacion/public /var/www/html
but keeps :/
a year ago
^
chown -R www-data:www-data /var/www/scomputacion/public && chown -R www-data:www-data /var/www/scomputacion/storage/ /var/www/scomputacion/bootstrap/ && ln -s /var/www/scomputacion/public /var/www/html
a year ago
in your dockerfile
a year ago
as the start command, not RUN
a year ago
no
a year ago
the start command in a dockerfile is equivalent to the last CMD
a year ago
please try your best to read my messages so that i can avoid repeating myself
a year ago
^