docker deployment

AnonymousTRIAL

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

AnonymousTRIAL

a year ago

N/A


a year ago

please share the compose file and all the commands you need to run and where


AnonymousTRIAL

a year ago


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

mmm how?


AnonymousTRIAL

a year ago

composer install*


AnonymousTRIAL

a year ago

I do the composer install inside the container, after docker exec -it bash


a year ago

do it in your dockerfile


a year ago

via RUN


AnonymousTRIAL

a year ago

okey ill see how


AnonymousTRIAL

a year ago

after the composer install i do this

1231353155673915400


a year ago

you'd do all the artisan stuff in the dockerfile too, and you might not need chown at all


AnonymousTRIAL

a year ago

like this?

1231353676593889300


a year ago

you should not be doing multiple updates and installs, condense all apt stuff into a single command


AnonymousTRIAL

a year ago

like this?

1231356111563657200


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

how?


AnonymousTRIAL

a year ago

1231359423268655000


AnonymousTRIAL

a year ago

1231359477903786000


AnonymousTRIAL

a year ago

I do not know if it is ok


a year ago

you had it right in the first screenshot, you dont need the ENV stuff


AnonymousTRIAL

a year ago

ok, only that, and now?


a year ago

does your app need postgres 14? would 16 work?


AnonymousTRIAL

a year ago

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?


AnonymousTRIAL

a year ago

No, I had created it and deleted it because I didn't know how to do it


a year ago

well then lets walk through the steps


AnonymousTRIAL

a year ago

so I started from 0


a year ago

create an empty project and name it


a year ago

and please send screenshots at every step of the way


AnonymousTRIAL

a year ago

from a github repo right?


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


AnonymousTRIAL

a year ago

sorry,


AnonymousTRIAL

a year ago

1231367519428673500


a year ago

add a postgres database


AnonymousTRIAL

a year ago

1231367743476076800


a year ago

create a new empty service


AnonymousTRIAL

a year ago

1231367893002748000


a year ago

name it and deploy it


AnonymousTRIAL

a year ago

1231368293575692300


a year ago

can you copy and paste the ARGs you have in your dockerfile for me


AnonymousTRIAL

a year ago

ARG DBHOST ARG DBPORT
ARG DBDATABASE ARG DBUSERNAME
ARG DB_PASSWORD


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


AnonymousTRIAL

a year ago

1231368938533949400


AnonymousTRIAL

a year ago

1231368993533857800


a year ago

and just this once no screenshot, click their eye icons to make sure they all show properly


AnonymousTRIAL

a year ago

yes


AnonymousTRIAL

a year ago

are the same of postgres


a year ago

did you have any other environment variables that you need to set for it?


AnonymousTRIAL

a year ago

my .env file has more things but idk if are necesary


AnonymousTRIAL

a year ago

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}"


AnonymousTRIAL

a year ago

i didnt touch anything of these, only the db things


a year ago

well add everything that is necessary to your service variables


AnonymousTRIAL

a year ago

I add all that


AnonymousTRIAL

a year ago

on the service?


a year ago

but the syntax changes from ${PUSHER_HOST} to ${{PUSHER_HOST}}


a year ago

yes


AnonymousTRIAL

a year ago

VITEAPPNAME="${{APPNAME}}" VITEPUSHERAPPKEY="${{PUSHERAPPKEY}}"
VITEPUSHERHOST="${{PUSHERHOST}}" VITEPUSHERPORT="${{PUSHERPORT}}"
VITEPUSHERSCHEME="${{PUSHERSCHEME}}" VITEPUSHERAPPCLUSTER="${{PUSHERAPPCLUSTER}}"


AnonymousTRIAL

a year ago

like that


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


AnonymousTRIAL

a year ago

1231370871898243000


a year ago

and always make sure you check them with the eye icon


AnonymousTRIAL

a year ago

I don't know, I didn't touch any of that, just the db stuff and nothing else, I left everything else as is


AnonymousTRIAL

a year ago

1231371223443705900


AnonymousTRIAL

a year ago

its ok


a year ago

awsome


a year ago

now set PORT=80


AnonymousTRIAL

a year ago

1231371743239868400


a year ago

go into its settings and generate a domain


AnonymousTRIAL

a year ago

done


AnonymousTRIAL

a year ago

1231372157481779200


a year ago

and i assume you have the dockerfile and your app in a repo right?


AnonymousTRIAL

a year ago

yes


a year ago

okay then go ahead and connect your repo


AnonymousTRIAL

a year ago

herE?

1231372720617296000


a year ago

yep


AnonymousTRIAL

a year ago

1231372814561448000


a year ago

deploy


AnonymousTRIAL

a year ago

building


a year ago

let me know how that goes


AnonymousTRIAL

a year ago

it keeps

1231373522438193200


a year ago

we shall wait


AnonymousTRIAL

a year ago

1231373884272672800



a year ago

build logs please -


AnonymousTRIAL

a year ago

1231374098165272600


a year ago

use the bookmarklet please


AnonymousTRIAL

a year ago

im trying


AnonymousTRIAL

a year ago

i dont understand, where do I have to drag the download logs?


a year ago

to the bookmarks bar


AnonymousTRIAL

a year ago

1231375659188879400


a year ago

you will want to enable the bookmarks bar


AnonymousTRIAL

a year ago


a year ago

your dockerfile needs to also install the composer cli before running the composer command


AnonymousTRIAL

a year ago

1231376522435100700


AnonymousTRIAL

a year ago

?


a year ago

i dont know php and the php eco system, so you tell me lol, is that how you install composer?


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

chat gpt will help me


a year ago

it would definitly be beneficial to learn the php ecosystem


AnonymousTRIAL

a year ago

It seems that if it is done that way


AnonymousTRIAL

a year ago

yes, its good. i´ll push


a year ago

sounds good


AnonymousTRIAL

a year ago

done


AnonymousTRIAL

a year ago

try to build again?


a year ago

yeah push your changes to github


AnonymousTRIAL

a year ago

1231378302082744300


AnonymousTRIAL

a year ago

fail again


AnonymousTRIAL

a year ago


a year ago

Composer could not find a composer.json file in /var/www/scomputacion

AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

1231380609549471700


a year ago

please make sure you have the composer.json file in the correct location



AnonymousTRIAL

a year ago

thats the repository, its in src


a year ago

yep i saw, please make sure you have the composer.json file in the correct location


AnonymousTRIAL

a year ago

It's okay, it has to be there


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

I am raising the container in my premises to see if it works for me


AnonymousTRIAL

a year ago

1231382702041862400


a year ago

building the docker container is easier than letting railway do it if you have the means to do that


AnonymousTRIAL

a year ago

1231383007797969000


AnonymousTRIAL

a year ago

:/


a year ago

same thing


a year ago

maybe your dockerfile runs that command in the wrong directory


AnonymousTRIAL

a year ago

yes but i dont understand


a year ago

read the docs section I linked


AnonymousTRIAL

a year ago

i read it but i dont understand.
Look, the old dockerfile works correctly, but the new doesnt

1231384725667709200


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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"]


AnonymousTRIAL

a year ago

i did that


AnonymousTRIAL

a year ago

but idk ill try


a year ago

make sure you enclose code in triple back ticks


AnonymousTRIAL

a year ago

well its seem its working

1231386604430561300


AnonymousTRIAL

a year ago

1231386960766177300


a year ago

now try on railway


AnonymousTRIAL

a year ago

ok


AnonymousTRIAL

a year ago


a year ago

what even is pecl?


AnonymousTRIAL

a year ago

good question


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

I know, it's My first work, i start like 3 months ago and im learning


AnonymousTRIAL

a year ago

But in this case im lost


a year ago

try re-deploying, Google might have had some network troubles


AnonymousTRIAL

a year ago

ok, builiding


AnonymousTRIAL

a year ago


AnonymousTRIAL

a year ago

same error?


a year ago

check out this link


AnonymousTRIAL

a year ago

ok, but that clean the db. It only runs once right?


a year ago

it shouldn't wipe anything, but as always with uncertainty make sure to check that yourself


AnonymousTRIAL

a year ago


AnonymousTRIAL

a year ago

Hello, yesterday I had to go. Failed again


a year ago

can you show me the code that connects to the database?


AnonymousTRIAL

a year ago

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?


AnonymousTRIAL

a year ago

DB_CONNECTION=pgsql
I was missing that in the railway variables



a year ago

i figured it was something like that


AnonymousTRIAL

a year ago

1231710623646355500


AnonymousTRIAL

a year ago

It's taking a long time, it's good, at least it doesn't fail xd


a year ago

unoptimized dockerfile most likely


AnonymousTRIAL

a year ago

1231711568236908800


AnonymousTRIAL

a year ago

It didn't fail, but if I see the logs it says that


a year ago

looks like you ran into the build time limit of the trial plan


AnonymousTRIAL

a year ago


a year ago

>> RUN pecl install amqp && docker-php-ext-enable amqp

No releases available for package "pecl.php.net/amqp"
install failed

AnonymousTRIAL

a year ago

1231715763807850800


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

The important thing is that it did not throw the pecl install amqp error


a year ago

yeah because it didnt get to that stage yet


AnonymousTRIAL

a year ago

No, the php artisan is the last instruction


AnonymousTRIAL

a year ago

Look the blue text, the install amqp executed correctly


a year ago

gotcha


a year ago

but it didnt on railway, meaning there is an issue with your dockerfile


AnonymousTRIAL

a year ago

But how, it's the same dockerfile


a year ago

^


AnonymousTRIAL

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


AnonymousTRIAL

a year ago

try again without changing anything


a year ago

^


AnonymousTRIAL

a year ago


AnonymousTRIAL

a year ago

same error?


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


AnonymousTRIAL

a year ago

but here he throw another error


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

i delete the php artisan commands, building again


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


AnonymousTRIAL

a year ago

1231720523600363500


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


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

That's what I meant with the railway console


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


AnonymousTRIAL

a year ago

1231722563760296000


AnonymousTRIAL

a year ago

i found that in a forum


a year ago

you arent using nixpacks


AnonymousTRIAL

a year ago

1231723358354407700


AnonymousTRIAL

a year ago

ill try to do that


a year ago

it was not my suggestion to use nixpacks


AnonymousTRIAL

a year ago

But I'm seeing that many people solve it that way, how can I do it?


a year ago

maybe you have forgotten to use an ARG


AnonymousTRIAL

a year ago

1231724641740001300


a year ago

^


a year ago

^


AnonymousTRIAL

a year ago

true


AnonymousTRIAL

a year ago

1231728439371895000


AnonymousTRIAL

a year ago


AnonymousTRIAL

a year ago

but failed in the next instruction


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


AnonymousTRIAL

a year ago

I see them from the page but from that file I can't find where the error is reported


AnonymousTRIAL

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

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


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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?


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

1231735675435614500


AnonymousTRIAL

a year ago

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


AnonymousTRIAL

a year ago

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

^


AnonymousTRIAL

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


AnonymousTRIAL

a year ago

1231739519431344000


a year ago

in your dockerfile


AnonymousTRIAL

a year ago

this is in the dockerfile


AnonymousTRIAL

a year ago

1231739810348142600


a year ago

as the start command, not RUN


AnonymousTRIAL

a year ago

like this?

1231740660562788400


a year ago

no


a year ago

the start command in a dockerfile is equivalent to the last CMD


AnonymousTRIAL

a year ago

1231741345987563500


a year ago

please try your best to read my messages so that i can avoid repeating myself


AnonymousTRIAL

a year ago

i did this but the error keeps

1231745113294901200


a year ago

^