2 years 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
264 Replies
2 years 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
2 years ago
well first off, your dockerfile should be doing compose install
I do the composer install inside the container, after docker exec -it bash
2 years ago
do it in your dockerfile
2 years ago
via RUN
2 years ago
you'd do all the artisan stuff in the dockerfile too, and you might not need chown at all
2 years 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
2 years 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
2 years ago
you'd set those in your service variables
2 years ago
you had it right in the first screenshot, you dont need the ENV stuff
2 years 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
2 years ago
okay then cant hurt to try 16
2 years ago
do you already have a railway project?
2 years ago
well then lets walk through the steps
2 years ago
create an empty project and name it
2 years ago
and please send screenshots at every step of the way
2 years ago
nope, we hardly ever want to do that
2 years ago
an empty project
please make sure to carefully read my messages
2 years ago
add a postgres database
2 years ago
create a new empty service
2 years ago
name it and deploy it
2 years ago
can you copy and paste the ARGs you have in your dockerfile for me
2 years 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
2 years ago
and just this once no screenshot, click their eye icons to make sure they all show properly
2 years 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}"
2 years ago
well add everything that is necessary to your service variables
2 years ago
but the syntax changes from ${PUSHER_HOST} to ${{PUSHER_HOST}}
2 years ago
yes
VITEAPPNAME="${{APPNAME}}" VITEPUSHERAPPKEY="${{PUSHERAPPKEY}}"
VITEPUSHERHOST="${{PUSHERHOST}}" VITEPUSHERPORT="${{PUSHERPORT}}"
VITEPUSHERSCHEME="${{PUSHERSCHEME}}" VITEPUSHERAPPCLUSTER="${{PUSHERAPPCLUSTER}}"
2 years ago
yep, no quotes though
2 years ago
but ${{APP_NAME}} isnt going to do anything unless you have also set APP_NAME as well
2 years 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
2 years ago
awsome
2 years ago
now set PORT=80
2 years ago
go into its settings and generate a domain
2 years ago
and i assume you have the dockerfile and your app in a repo right?
2 years ago
okay then go ahead and connect your repo
2 years ago
yep
2 years ago
deploy
2 years ago
let me know how that goes
2 years ago
we shall wait
2 years ago
build logs please -
2 years ago
use the bookmarklet please
2 years ago
to the bookmarks bar
2 years ago
you will want to enable the bookmarks bar
2 years ago
your dockerfile needs to also install the composer cli before running the composer command
2 years 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
2 years ago
it would definitly be beneficial to learn the php ecosystem
2 years ago
sounds good
2 years ago
yeah push your changes to github
2 years ago
Composer could not find a composer.json file in /var/www/scomputacionSure. 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
2 years ago
please make sure you have the composer.json file in the correct location
2 years 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
2 years 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?
2 years ago
railway builds and runs the container, but your dockerfile defines how the container is built
2 years ago
building the docker container is easier than letting railway do it if you have the means to do that
2 years ago
same thing
2 years ago
maybe your dockerfile runs that command in the wrong directory
2 years 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
2 years 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"]
2 years ago
make sure you enclose code in triple back ticks
2 years ago
now try on railway
2 years 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.
2 years ago
it's going to be quite difficult to deploy your app if you aren't familiar with the technologies involved
2 years 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
2 years ago
just learning the language can only get you so far, i can not express how important it is to know the ecosystem too
2 years 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
2 years ago
try re-deploying, Google might have had some network troubles
2 years ago
check out this link
2 years ago
it shouldn't wipe anything, but as always with uncertainty make sure to check that yourself
2 years 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
2 years ago
but you still define the variables laravel uses in code, dont you?
2 years ago
i figured it was something like that
2 years ago
unoptimized dockerfile most likely
2 years ago
looks like you ran into the build time limit of the trial plan
2 years ago
>> RUN pecl install amqp && docker-php-ext-enable amqp
No releases available for package "pecl.php.net/amqp"
install failedtry 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
2 years ago
yeah because it didnt get to that stage yet
2 years ago
gotcha
2 years ago
but it didnt on railway, meaning there is an issue with your dockerfile
2 years 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
2 years ago
im sorry but working locally does not mean its a platform issue
2 years ago
^
2 years 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
2 years 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
2 years ago
you can do it in your start command sure
2 years ago
well you can't just delete them
2 years ago
this is why i suggested coming back to this when you are more familiar with the php eco system
2 years ago
any variable you use during build needs to be referenced with ARG
2 years 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
2 years ago
but railway does not provide ssh
2 years ago
there is no such thing
2 years ago
you can use railway run but that only runs the command locally with the service variables available
2 years ago
your best options are to run them in the dockerfile or in the start command
2 years ago
you arent using nixpacks
2 years ago
it was not my suggestion to use nixpacks
2 years ago
maybe you have forgotten to use an ARG
2 years ago
^
2 years ago
^
2 years ago
file_get_contents(/var/www/scomputacion/.env): Failed to open stream: No such file or directory2 years 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.
2 years 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?
2 years 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
2 years 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
2 years ago
theres no hour limit on the trial plan??
2 years 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.
2 years ago
indeed, no time limit, only credit and resource limit
2 years 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
2 years 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 :/
2 years 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
2 years ago
in your dockerfile
2 years ago
as the start command, not RUN
2 years ago
no
2 years ago
the start command in a dockerfile is equivalent to the last CMD
2 years ago
please try your best to read my messages so that i can avoid repeating myself
2 years ago
^









































