Dockerizado y con script de instalación
This commit is contained in:
@@ -1,31 +1,31 @@
|
|||||||
|
# backend/Dockerfile
|
||||||
FROM python:3.11-slim
|
FROM python:3.11-slim
|
||||||
|
|
||||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
# Evitar .pyc y buffering
|
||||||
PYTHONUNBUFFERED=1
|
ENV PYTHONDONTWRITEBYTECODE=1
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Dependencias del sistema mínimas
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
build-essential \
|
build-essential \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Primero copiamos el pyproject para aprovechar la caché al instalar deps
|
# Copiamos pyproject y lock si lo hubiera
|
||||||
COPY pyproject.toml ./
|
COPY pyproject.toml ./
|
||||||
# Si tienes setup.cfg/setup.py, los copias también
|
|
||||||
|
|
||||||
|
# Instalamos dependencias
|
||||||
RUN pip install --upgrade pip && \
|
RUN pip install --upgrade pip && \
|
||||||
pip install .
|
pip install .
|
||||||
|
|
||||||
# Ahora copiamos todo el código
|
# Copiamos el resto del código (respetando .dockerignore)
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Crear directorios base de datos
|
# Variables de autenticación básica
|
||||||
RUN mkdir -p /app/data/input /app/data/output
|
ENV BASIC_AUTH_USERNAME=admin
|
||||||
|
ENV BASIC_AUTH_PASSWORD=admin
|
||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
# Credenciales por defecto (en runtime las puedes sobrescribir)
|
CMD ["python", "-m", "uvicorn", "beyond_api.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
ENV BASIC_AUTH_USERNAME=beyond \
|
|
||||||
BASIC_AUTH_PASSWORD=beyond2026
|
|
||||||
|
|
||||||
CMD ["uvicorn", "beyond_api.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,301 +0,0 @@
|
|||||||
interaction_id,datetime_start,queue_skill,channel,duration_talk,hold_time,wrap_up_time,agent_id,transfer_flag,caller_id
|
|
||||||
id_1,2024-01-07 11:28:00,ventas,voz,708,17,22,A3,False,+34693410762
|
|
||||||
id_2,2024-01-24 12:35:00,soporte,voz,1028,37,26,A2,True,+34613953367
|
|
||||||
id_3,2024-01-12 13:01:00,ventas,email,507,20,43,A5,False,+34642860080
|
|
||||||
id_4,2024-01-27 18:41:00,ventas,email,217,24,37,A4,False,+34632049003
|
|
||||||
id_5,2024-01-23 11:56:00,ventas,voz,624,19,30,A1,False,+34695672411
|
|
||||||
id_6,2024-01-15 19:06:00,soporte,voz,789,52,45,A5,False,+34668979792
|
|
||||||
id_7,2024-01-04 09:39:00,ventas,email,510,60,44,A2,True,+34652631083
|
|
||||||
id_8,2024-01-02 17:35:00,posventa,voz,321,44,42,A4,False,+34636433622
|
|
||||||
id_9,2024-01-28 16:39:00,retenciones,voz,694,43,75,A2,False,+34657055419
|
|
||||||
id_10,2024-01-28 16:28:00,posventa,chat,814,41,53,A3,False,+34691355424
|
|
||||||
id_11,2024-01-27 12:41:00,soporte,voz,432,23,44,A3,False,+34604545583
|
|
||||||
id_12,2024-01-23 14:23:00,ventas,voz,795,49,65,A4,False,+34614881728
|
|
||||||
id_13,2024-01-03 12:46:00,ventas,chat,794,45,62,A3,False,+34697636744
|
|
||||||
id_14,2024-01-15 17:41:00,retenciones,voz,667,2,35,A4,False,+34628433648
|
|
||||||
id_15,2024-01-20 11:29:00,ventas,chat,659,9,18,A1,False,+34621970758
|
|
||||||
id_16,2024-01-27 10:21:00,retenciones,email,638,35,53,A5,False,+34650441204
|
|
||||||
id_17,2024-01-06 19:27:00,retenciones,email,517,2,34,A2,False,+34653892568
|
|
||||||
id_18,2024-01-07 08:00:00,ventas,voz,750,22,18,A2,False,+34672931048
|
|
||||||
id_19,2024-01-03 14:05:00,retenciones,voz,68,36,34,A2,False,+34623234510
|
|
||||||
id_20,2024-01-27 13:31:00,ventas,chat,542,67,42,A3,False,+34613022704
|
|
||||||
id_21,2024-01-26 11:11:00,posventa,email,596,0,23,A3,True,+34667922032
|
|
||||||
id_22,2024-01-02 09:27:00,soporte,chat,401,26,44,A3,False,+34688917675
|
|
||||||
id_23,2024-01-26 13:31:00,soporte,email,447,33,20,A3,False,+34606659908
|
|
||||||
id_24,2024-01-20 09:05:00,ventas,email,466,54,34,A2,False,+34635562619
|
|
||||||
id_25,2024-01-27 13:15:00,soporte,voz,619,19,16,A4,False,+34677809459
|
|
||||||
id_26,2024-01-09 08:39:00,posventa,chat,613,42,37,A5,False,+34670721464
|
|
||||||
id_27,2024-01-25 09:22:00,soporte,email,974,37,30,A3,False,+34671450611
|
|
||||||
id_28,2024-01-28 08:01:00,ventas,voz,495,50,42,A1,False,+34623448674
|
|
||||||
id_29,2024-01-19 10:19:00,retenciones,chat,650,36,29,A3,False,+34654710375
|
|
||||||
id_30,2024-01-20 10:47:00,ventas,voz,646,35,29,A5,True,+34619576703
|
|
||||||
id_31,2024-01-14 09:01:00,retenciones,voz,809,56,51,A4,False,+34655403796
|
|
||||||
id_32,2024-01-16 11:55:00,posventa,email,409,49,46,A4,False,+34624947744
|
|
||||||
id_33,2024-01-16 19:58:00,soporte,chat,326,14,53,A2,False,+34658245345
|
|
||||||
id_34,2024-01-21 08:27:00,soporte,email,552,47,45,A5,False,+34640820227
|
|
||||||
id_35,2024-01-03 08:16:00,retenciones,email,597,33,49,A5,False,+34666880548
|
|
||||||
id_36,2024-01-24 08:45:00,posventa,email,530,20,51,A4,False,+34631725526
|
|
||||||
id_37,2024-01-01 10:17:00,retenciones,voz,742,31,49,A2,False,+34691299103
|
|
||||||
id_38,2024-01-15 13:22:00,posventa,voz,952,31,22,A1,False,+34694569232
|
|
||||||
id_39,2024-01-08 08:08:00,ventas,voz,408,57,53,A2,False,+34676294551
|
|
||||||
id_40,2024-01-13 19:57:00,posventa,email,479,18,38,A1,False,+34602503771
|
|
||||||
id_41,2024-01-02 09:31:00,posventa,chat,502,31,74,A5,False,+34671531065
|
|
||||||
id_42,2024-01-22 08:51:00,posventa,email,226,0,46,A3,False,+34692526139
|
|
||||||
id_43,2024-01-12 19:04:00,ventas,email,842,26,34,A1,False,+34657351079
|
|
||||||
id_44,2024-01-20 09:59:00,retenciones,email,341,3,10,A3,False,+34603695961
|
|
||||||
id_45,2024-01-05 17:52:00,ventas,chat,572,14,34,A4,False,+34620840174
|
|
||||||
id_46,2024-01-02 13:47:00,soporte,chat,631,35,73,A1,False,+34677183765
|
|
||||||
id_47,2024-01-29 14:02:00,retenciones,email,453,4,36,A2,False,+34698208175
|
|
||||||
id_48,2024-01-21 14:35:00,ventas,email,974,24,21,A3,False,+34694919177
|
|
||||||
id_49,2024-01-22 12:35:00,soporte,voz,574,20,40,A3,False,+34610495300
|
|
||||||
id_50,2024-01-13 11:15:00,soporte,email,1069,33,30,A5,True,+34699967871
|
|
||||||
id_51,2024-01-27 11:23:00,ventas,email,749,66,43,A3,False,+34604035851
|
|
||||||
id_52,2024-01-03 08:32:00,posventa,voz,545,7,48,A1,False,+34630185054
|
|
||||||
id_53,2024-01-14 09:50:00,retenciones,chat,291,52,22,A2,False,+34608454561
|
|
||||||
id_54,2024-01-19 16:06:00,ventas,voz,914,37,29,A5,False,+34610617244
|
|
||||||
id_55,2024-01-24 11:24:00,ventas,voz,474,47,48,A4,False,+34693437616
|
|
||||||
id_56,2024-01-03 11:17:00,ventas,email,457,39,17,A2,False,+34662976036
|
|
||||||
id_57,2024-01-12 08:54:00,soporte,email,765,46,59,A4,False,+34688146618
|
|
||||||
id_58,2024-01-19 08:35:00,soporte,chat,604,24,30,A5,False,+34656294783
|
|
||||||
id_59,2024-01-20 10:57:00,posventa,voz,436,71,24,A5,False,+34610198499
|
|
||||||
id_60,2024-01-21 14:15:00,soporte,email,357,16,39,A3,False,+34617310852
|
|
||||||
id_61,2024-01-03 14:28:00,posventa,email,434,23,46,A3,False,+34631665404
|
|
||||||
id_62,2024-01-06 14:45:00,posventa,email,487,21,43,A4,False,+34680497273
|
|
||||||
id_63,2024-01-02 12:28:00,ventas,voz,310,1,29,A2,False,+34675524262
|
|
||||||
id_64,2024-01-27 17:25:00,ventas,chat,557,15,11,A1,False,+34638538877
|
|
||||||
id_65,2024-01-26 11:27:00,soporte,email,729,40,52,A2,False,+34638503931
|
|
||||||
id_66,2024-01-17 16:55:00,ventas,voz,826,0,57,A1,False,+34639301804
|
|
||||||
id_67,2024-01-13 12:15:00,soporte,voz,644,30,41,A1,False,+34699204497
|
|
||||||
id_68,2024-01-15 16:48:00,retenciones,voz,445,21,67,A5,False,+34693691765
|
|
||||||
id_69,2024-01-03 14:56:00,soporte,chat,571,17,35,A4,False,+34693837987
|
|
||||||
id_70,2024-01-26 15:57:00,soporte,email,452,14,26,A2,False,+34642734307
|
|
||||||
id_71,2024-01-27 13:16:00,posventa,voz,470,0,17,A4,False,+34658842658
|
|
||||||
id_72,2024-01-29 13:17:00,posventa,voz,735,63,14,A1,False,+34686966281
|
|
||||||
id_73,2024-01-24 09:58:00,ventas,email,835,20,14,A4,False,+34628267184
|
|
||||||
id_74,2024-01-13 08:33:00,retenciones,chat,870,36,68,A4,False,+34629702914
|
|
||||||
id_75,2024-01-21 14:36:00,posventa,email,784,46,19,A1,False,+34606195200
|
|
||||||
id_76,2024-01-19 11:00:00,ventas,voz,472,51,63,A4,False,+34685072967
|
|
||||||
id_77,2024-01-07 17:57:00,retenciones,voz,910,32,57,A2,False,+34607102173
|
|
||||||
id_78,2024-01-27 16:16:00,soporte,voz,613,42,60,A5,False,+34648840101
|
|
||||||
id_79,2024-01-28 09:37:00,posventa,voz,922,55,26,A4,False,+34669562616
|
|
||||||
id_80,2024-01-06 08:23:00,soporte,chat,623,24,48,A4,False,+34643558992
|
|
||||||
id_81,2024-01-05 11:09:00,soporte,voz,597,45,35,A4,False,+34615734209
|
|
||||||
id_82,2024-01-13 18:42:00,ventas,voz,267,27,38,A5,False,+34613081782
|
|
||||||
id_83,2024-01-16 18:53:00,ventas,voz,418,41,28,A2,False,+34665438362
|
|
||||||
id_84,2024-01-29 09:57:00,soporte,chat,934,42,32,A4,False,+34616618153
|
|
||||||
id_85,2024-01-29 13:20:00,posventa,voz,936,77,51,A4,False,+34675589337
|
|
||||||
id_86,2024-01-13 18:08:00,ventas,voz,542,29,26,A4,False,+34650066487
|
|
||||||
id_87,2024-01-30 18:47:00,ventas,chat,577,25,49,A3,False,+34693842126
|
|
||||||
id_88,2024-01-15 15:21:00,posventa,chat,751,45,28,A4,False,+34607585153
|
|
||||||
id_89,2024-01-13 17:13:00,posventa,voz,773,39,34,A2,False,+34647756479
|
|
||||||
id_90,2024-01-25 14:36:00,retenciones,voz,780,35,20,A1,False,+34664413145
|
|
||||||
id_91,2024-01-30 19:24:00,ventas,email,643,48,55,A3,False,+34693198563
|
|
||||||
id_92,2024-01-15 13:33:00,ventas,voz,730,71,60,A5,False,+34616203305
|
|
||||||
id_93,2024-01-09 12:05:00,posventa,email,645,46,39,A5,False,+34679357216
|
|
||||||
id_94,2024-01-21 13:20:00,soporte,voz,272,20,30,A5,False,+34616514877
|
|
||||||
id_95,2024-01-30 15:54:00,ventas,voz,759,32,66,A1,False,+34616263882
|
|
||||||
id_96,2024-01-08 17:50:00,ventas,email,585,21,47,A2,False,+34682405138
|
|
||||||
id_97,2024-01-20 08:19:00,posventa,voz,508,23,17,A5,False,+34653215075
|
|
||||||
id_98,2024-01-13 18:02:00,soporte,email,759,27,33,A5,False,+34603757974
|
|
||||||
id_99,2024-01-10 19:01:00,ventas,email,801,18,52,A1,False,+34608112074
|
|
||||||
id_100,2024-01-15 15:37:00,posventa,email,374,0,24,A5,False,+34677822269
|
|
||||||
id_101,2024-01-28 19:49:00,retenciones,chat,674,17,41,A2,False,+34601135964
|
|
||||||
id_102,2024-01-08 18:40:00,retenciones,voz,568,45,49,A3,False,+34608910852
|
|
||||||
id_103,2024-01-19 18:13:00,posventa,voz,158,37,35,A3,False,+34607021862
|
|
||||||
id_104,2024-01-08 10:37:00,posventa,chat,789,0,62,A1,False,+34649875088
|
|
||||||
id_105,2024-01-01 14:01:00,ventas,chat,778,31,26,A5,False,+34611630982
|
|
||||||
id_106,2024-01-19 15:41:00,ventas,voz,657,36,33,A5,False,+34609496563
|
|
||||||
id_107,2024-01-30 14:26:00,soporte,email,502,38,23,A3,False,+34609803005
|
|
||||||
id_108,2024-01-04 13:01:00,soporte,chat,436,39,45,A1,False,+34637612325
|
|
||||||
id_109,2024-01-13 11:44:00,soporte,chat,546,10,33,A3,False,+34615043403
|
|
||||||
id_110,2024-01-13 09:26:00,soporte,chat,675,57,55,A5,False,+34607726890
|
|
||||||
id_111,2024-01-27 12:19:00,retenciones,email,244,59,49,A5,False,+34660628583
|
|
||||||
id_112,2024-01-30 09:24:00,ventas,email,588,47,25,A5,False,+34636346859
|
|
||||||
id_113,2024-01-04 11:04:00,retenciones,email,643,38,43,A1,False,+34676796917
|
|
||||||
id_114,2024-01-19 15:40:00,soporte,chat,372,28,51,A1,False,+34669111188
|
|
||||||
id_115,2024-01-26 11:53:00,ventas,email,505,49,24,A5,False,+34618492846
|
|
||||||
id_116,2024-01-09 12:08:00,soporte,chat,454,42,30,A3,False,+34688121122
|
|
||||||
id_117,2024-01-20 16:25:00,soporte,email,554,42,59,A3,False,+34625146282
|
|
||||||
id_118,2024-01-27 19:58:00,soporte,email,436,25,35,A3,False,+34654440645
|
|
||||||
id_119,2024-01-21 15:32:00,posventa,chat,816,0,24,A1,False,+34635966581
|
|
||||||
id_120,2024-01-22 19:39:00,ventas,email,703,81,40,A4,True,+34688213938
|
|
||||||
id_121,2024-01-27 15:18:00,retenciones,voz,510,0,18,A1,False,+34613781009
|
|
||||||
id_122,2024-01-01 10:46:00,retenciones,voz,893,78,69,A3,False,+34665954738
|
|
||||||
id_123,2024-01-04 08:07:00,soporte,email,318,14,23,A4,True,+34699831174
|
|
||||||
id_124,2024-01-29 15:00:00,posventa,email,950,0,45,A1,False,+34623656190
|
|
||||||
id_125,2024-01-29 15:53:00,ventas,voz,762,0,42,A2,False,+34685808215
|
|
||||||
id_126,2024-01-14 15:45:00,ventas,chat,795,22,57,A5,False,+34675094484
|
|
||||||
id_127,2024-01-14 14:47:00,soporte,chat,646,15,50,A2,False,+34606202258
|
|
||||||
id_128,2024-01-04 19:17:00,ventas,chat,693,5,27,A3,False,+34612790902
|
|
||||||
id_129,2024-01-12 11:04:00,ventas,chat,837,16,54,A2,False,+34624899065
|
|
||||||
id_130,2024-01-22 19:23:00,soporte,email,527,33,25,A1,False,+34609944790
|
|
||||||
id_131,2024-01-17 09:50:00,retenciones,email,940,31,28,A4,False,+34686131989
|
|
||||||
id_132,2024-01-11 11:25:00,soporte,voz,924,4,41,A2,False,+34678987338
|
|
||||||
id_133,2024-01-06 09:20:00,soporte,chat,598,57,37,A1,False,+34606238795
|
|
||||||
id_134,2024-01-23 12:41:00,soporte,email,464,21,30,A3,False,+34657701082
|
|
||||||
id_135,2024-01-08 09:11:00,posventa,email,580,75,57,A2,False,+34689813693
|
|
||||||
id_136,2024-01-26 09:59:00,retenciones,voz,651,32,36,A1,True,+34631970599
|
|
||||||
id_137,2024-01-11 11:48:00,posventa,voz,749,60,38,A4,False,+34642955157
|
|
||||||
id_138,2024-01-05 15:32:00,soporte,voz,711,35,14,A4,False,+34686654442
|
|
||||||
id_139,2024-01-17 18:44:00,retenciones,chat,674,9,8,A2,False,+34628104320
|
|
||||||
id_140,2024-01-25 18:39:00,soporte,voz,529,0,33,A2,False,+34678021860
|
|
||||||
id_141,2024-01-12 19:50:00,posventa,chat,724,0,29,A3,False,+34650760636
|
|
||||||
id_142,2024-01-17 17:56:00,ventas,chat,550,3,36,A3,False,+34636045138
|
|
||||||
id_143,2024-01-08 12:16:00,posventa,email,857,51,33,A5,False,+34610563214
|
|
||||||
id_144,2024-01-27 17:40:00,retenciones,voz,726,38,43,A1,False,+34623387092
|
|
||||||
id_145,2024-01-22 17:06:00,retenciones,voz,689,25,56,A5,False,+34628348817
|
|
||||||
id_146,2024-01-27 17:38:00,retenciones,voz,583,31,33,A1,False,+34652879148
|
|
||||||
id_147,2024-01-02 10:36:00,posventa,chat,94,55,61,A3,False,+34630715395
|
|
||||||
id_148,2024-01-29 13:24:00,posventa,email,219,32,65,A5,False,+34607152747
|
|
||||||
id_149,2024-01-30 09:54:00,ventas,chat,651,29,49,A5,False,+34640739629
|
|
||||||
id_150,2024-01-20 08:28:00,soporte,chat,565,29,31,A1,False,+34693144811
|
|
||||||
id_151,2024-01-15 16:09:00,posventa,voz,546,16,66,A5,True,+34646695565
|
|
||||||
id_152,2024-01-24 09:03:00,soporte,chat,633,43,64,A4,False,+34617562548
|
|
||||||
id_153,2024-01-14 16:14:00,ventas,email,910,10,54,A3,False,+34684445004
|
|
||||||
id_154,2024-01-02 16:06:00,retenciones,email,557,33,47,A1,False,+34654496748
|
|
||||||
id_155,2024-01-14 17:42:00,retenciones,email,496,18,48,A3,False,+34620521013
|
|
||||||
id_156,2024-01-15 14:48:00,posventa,chat,475,80,47,A4,False,+34643951994
|
|
||||||
id_157,2024-01-10 10:49:00,retenciones,email,633,29,38,A2,False,+34624586222
|
|
||||||
id_158,2024-01-25 16:03:00,soporte,chat,789,13,42,A4,False,+34667001666
|
|
||||||
id_159,2024-01-27 19:28:00,soporte,email,657,36,49,A5,False,+34609462743
|
|
||||||
id_160,2024-01-28 13:07:00,retenciones,chat,1002,25,41,A5,False,+34606155579
|
|
||||||
id_161,2024-01-16 19:04:00,ventas,chat,608,50,42,A3,False,+34653811239
|
|
||||||
id_162,2024-01-27 08:05:00,soporte,chat,772,52,40,A5,False,+34604684346
|
|
||||||
id_163,2024-01-27 16:12:00,retenciones,chat,700,47,55,A4,False,+34610115078
|
|
||||||
id_164,2024-01-05 18:44:00,posventa,email,906,26,42,A2,False,+34610528294
|
|
||||||
id_165,2024-01-18 11:01:00,posventa,email,605,55,42,A2,False,+34642106078
|
|
||||||
id_166,2024-01-02 19:23:00,ventas,chat,609,25,42,A5,False,+34679146438
|
|
||||||
id_167,2024-01-10 16:31:00,retenciones,voz,529,52,48,A2,False,+34675176851
|
|
||||||
id_168,2024-01-04 09:03:00,retenciones,voz,459,51,24,A2,True,+34684483977
|
|
||||||
id_169,2024-01-22 08:21:00,soporte,voz,503,32,45,A1,True,+34695019914
|
|
||||||
id_170,2024-01-01 13:46:00,soporte,chat,494,61,39,A5,False,+34636089369
|
|
||||||
id_171,2024-01-02 09:28:00,ventas,chat,617,53,31,A4,False,+34698023086
|
|
||||||
id_172,2024-01-14 11:21:00,soporte,email,775,38,43,A4,False,+34697042181
|
|
||||||
id_173,2024-01-19 16:04:00,posventa,chat,590,34,36,A2,False,+34601074961
|
|
||||||
id_174,2024-01-15 19:15:00,soporte,email,670,5,42,A1,False,+34689858638
|
|
||||||
id_175,2024-01-27 09:51:00,ventas,chat,702,24,64,A2,False,+34655940773
|
|
||||||
id_176,2024-01-16 16:59:00,soporte,email,900,32,29,A5,False,+34670047063
|
|
||||||
id_177,2024-01-08 18:12:00,posventa,voz,576,6,25,A5,False,+34613476005
|
|
||||||
id_178,2024-01-11 16:32:00,soporte,voz,923,48,52,A4,False,+34638836811
|
|
||||||
id_179,2024-01-25 13:21:00,soporte,chat,478,7,40,A5,False,+34685936029
|
|
||||||
id_180,2024-01-01 11:25:00,retenciones,chat,443,9,35,A5,False,+34608439469
|
|
||||||
id_181,2024-01-26 09:14:00,posventa,email,501,21,44,A4,False,+34601443717
|
|
||||||
id_182,2024-01-09 13:08:00,soporte,email,440,31,30,A4,False,+34642307399
|
|
||||||
id_183,2024-01-18 19:19:00,posventa,chat,809,19,59,A2,False,+34679790594
|
|
||||||
id_184,2024-01-09 19:41:00,retenciones,email,639,63,33,A4,False,+34614150540
|
|
||||||
id_185,2024-01-25 10:57:00,soporte,chat,529,0,48,A4,False,+34653307679
|
|
||||||
id_186,2024-01-19 19:17:00,ventas,email,675,40,10,A3,False,+34681718171
|
|
||||||
id_187,2024-01-10 10:34:00,soporte,chat,517,1,47,A3,False,+34699989204
|
|
||||||
id_188,2024-01-26 15:19:00,retenciones,email,516,57,51,A1,False,+34620808635
|
|
||||||
id_189,2024-01-24 09:48:00,soporte,voz,1118,38,38,A2,False,+34617066318
|
|
||||||
id_190,2024-01-02 11:05:00,posventa,email,525,12,19,A2,False,+34628175911
|
|
||||||
id_191,2024-01-21 08:34:00,soporte,voz,504,57,64,A4,False,+34654181889
|
|
||||||
id_192,2024-01-23 12:04:00,posventa,chat,855,27,28,A5,False,+34633523310
|
|
||||||
id_193,2024-01-14 15:38:00,posventa,chat,829,0,34,A1,False,+34634932801
|
|
||||||
id_194,2024-01-03 12:04:00,soporte,chat,376,52,29,A4,False,+34604600108
|
|
||||||
id_195,2024-01-23 18:09:00,ventas,email,180,35,36,A4,False,+34647602635
|
|
||||||
id_196,2024-01-01 16:53:00,posventa,voz,846,46,58,A3,False,+34601805808
|
|
||||||
id_197,2024-01-24 19:55:00,retenciones,chat,806,34,36,A4,False,+34653175588
|
|
||||||
id_198,2024-01-20 17:28:00,soporte,chat,560,5,49,A2,False,+34615702852
|
|
||||||
id_199,2024-01-01 08:50:00,retenciones,chat,783,36,54,A4,False,+34645587883
|
|
||||||
id_200,2024-01-06 11:22:00,ventas,chat,30,11,49,A3,False,+34604990961
|
|
||||||
id_201,2024-01-21 08:54:00,posventa,email,475,68,37,A2,False,+34642439798
|
|
||||||
id_202,2024-01-26 18:09:00,posventa,voz,643,33,42,A5,False,+34683149786
|
|
||||||
id_203,2024-01-08 16:45:00,ventas,chat,636,45,52,A5,False,+34613045697
|
|
||||||
id_204,2024-01-18 13:08:00,ventas,voz,963,23,43,A4,False,+34665969098
|
|
||||||
id_205,2024-01-04 09:37:00,soporte,chat,837,5,48,A2,False,+34622910282
|
|
||||||
id_206,2024-01-01 15:53:00,ventas,chat,740,3,57,A4,False,+34669070841
|
|
||||||
id_207,2024-01-07 12:18:00,retenciones,voz,401,0,30,A4,False,+34645938649
|
|
||||||
id_208,2024-01-11 10:07:00,retenciones,chat,335,51,63,A4,False,+34620554754
|
|
||||||
id_209,2024-01-21 17:07:00,retenciones,chat,100,75,19,A3,False,+34610104107
|
|
||||||
id_210,2024-01-04 18:47:00,ventas,chat,270,62,44,A1,False,+34691199914
|
|
||||||
id_211,2024-01-13 12:22:00,ventas,chat,783,26,22,A2,False,+34644810380
|
|
||||||
id_212,2024-01-22 10:33:00,ventas,email,906,37,23,A1,False,+34659468269
|
|
||||||
id_213,2024-01-27 19:34:00,ventas,voz,434,33,29,A2,False,+34645844569
|
|
||||||
id_214,2024-01-25 18:06:00,ventas,email,911,10,48,A2,False,+34692540486
|
|
||||||
id_215,2024-01-24 08:41:00,soporte,voz,435,26,33,A4,False,+34679690286
|
|
||||||
id_216,2024-01-27 14:21:00,ventas,email,830,30,40,A2,False,+34692796686
|
|
||||||
id_217,2024-01-10 15:57:00,posventa,email,747,24,44,A3,False,+34689380419
|
|
||||||
id_218,2024-01-18 15:18:00,retenciones,voz,901,38,53,A5,False,+34671537554
|
|
||||||
id_219,2024-01-04 17:32:00,ventas,voz,371,24,47,A3,False,+34617644180
|
|
||||||
id_220,2024-01-17 13:47:00,ventas,email,527,8,28,A1,False,+34655666186
|
|
||||||
id_221,2024-01-10 16:13:00,retenciones,email,490,33,33,A4,False,+34684143761
|
|
||||||
id_222,2024-01-03 17:53:00,posventa,email,461,64,33,A2,True,+34614578363
|
|
||||||
id_223,2024-01-14 10:03:00,ventas,email,713,62,34,A2,False,+34682424160
|
|
||||||
id_224,2024-01-04 10:08:00,ventas,email,559,7,29,A3,False,+34629737667
|
|
||||||
id_225,2024-01-13 08:59:00,ventas,email,646,0,44,A1,False,+34650825596
|
|
||||||
id_226,2024-01-26 10:21:00,retenciones,email,766,43,69,A4,False,+34690493043
|
|
||||||
id_227,2024-01-08 13:43:00,retenciones,voz,862,43,35,A5,False,+34639970870
|
|
||||||
id_228,2024-01-16 19:16:00,retenciones,voz,362,0,32,A4,False,+34623255666
|
|
||||||
id_229,2024-01-08 13:04:00,posventa,voz,773,45,51,A4,False,+34630267797
|
|
||||||
id_230,2024-01-18 15:38:00,retenciones,email,368,35,55,A4,False,+34613116915
|
|
||||||
id_231,2024-01-02 11:32:00,soporte,chat,463,6,16,A2,False,+34641765312
|
|
||||||
id_232,2024-01-11 10:51:00,retenciones,email,361,33,38,A5,False,+34623683333
|
|
||||||
id_233,2024-01-03 13:42:00,posventa,chat,937,67,40,A4,False,+34636432549
|
|
||||||
id_234,2024-01-18 10:29:00,retenciones,chat,106,41,48,A2,False,+34679110216
|
|
||||||
id_235,2024-01-15 12:34:00,ventas,chat,707,12,40,A4,False,+34642866200
|
|
||||||
id_236,2024-01-02 16:53:00,soporte,chat,598,48,16,A5,False,+34699907919
|
|
||||||
id_237,2024-01-22 11:02:00,posventa,chat,440,37,54,A1,False,+34675013292
|
|
||||||
id_238,2024-01-28 19:31:00,posventa,chat,30,34,25,A2,False,+34604746771
|
|
||||||
id_239,2024-01-18 19:05:00,posventa,voz,268,55,57,A3,False,+34668082045
|
|
||||||
id_240,2024-01-11 09:30:00,retenciones,chat,196,18,33,A3,False,+34694597309
|
|
||||||
id_241,2024-01-14 10:06:00,retenciones,email,522,33,42,A1,False,+34692210534
|
|
||||||
id_242,2024-01-28 11:28:00,soporte,voz,600,39,74,A2,False,+34624525886
|
|
||||||
id_243,2024-01-05 11:34:00,posventa,chat,365,0,48,A5,False,+34647378941
|
|
||||||
id_244,2024-01-23 09:26:00,soporte,email,751,57,34,A4,False,+34652010809
|
|
||||||
id_245,2024-01-24 14:04:00,posventa,chat,401,29,10,A1,False,+34618608310
|
|
||||||
id_246,2024-01-21 17:03:00,ventas,chat,1012,22,48,A2,False,+34603815144
|
|
||||||
id_247,2024-01-29 11:28:00,posventa,email,894,25,29,A2,False,+34600442939
|
|
||||||
id_248,2024-01-16 08:09:00,retenciones,email,807,28,42,A5,False,+34654254875
|
|
||||||
id_249,2024-01-11 14:33:00,retenciones,chat,410,0,45,A5,False,+34632038060
|
|
||||||
id_250,2024-01-19 12:31:00,retenciones,chat,548,29,43,A5,True,+34629084871
|
|
||||||
id_251,2024-01-25 14:42:00,retenciones,chat,818,41,5,A4,False,+34698090211
|
|
||||||
id_252,2024-01-11 11:14:00,retenciones,chat,637,8,13,A3,False,+34677457397
|
|
||||||
id_253,2024-01-08 17:37:00,soporte,voz,605,13,42,A2,False,+34631099208
|
|
||||||
id_254,2024-01-02 09:02:00,retenciones,voz,649,35,26,A5,False,+34681193128
|
|
||||||
id_255,2024-01-25 17:54:00,soporte,voz,471,48,40,A2,False,+34689198479
|
|
||||||
id_256,2024-01-28 09:10:00,posventa,chat,653,13,43,A5,False,+34680925517
|
|
||||||
id_257,2024-01-28 17:24:00,retenciones,voz,497,14,43,A2,False,+34654610032
|
|
||||||
id_258,2024-01-24 12:34:00,retenciones,voz,702,5,57,A3,False,+34636213515
|
|
||||||
id_259,2024-01-09 09:20:00,soporte,chat,550,62,47,A1,False,+34697101535
|
|
||||||
id_260,2024-01-11 13:21:00,soporte,chat,746,37,30,A1,False,+34684370894
|
|
||||||
id_261,2024-01-19 14:23:00,ventas,email,405,0,52,A3,False,+34652315765
|
|
||||||
id_262,2024-01-19 14:28:00,soporte,email,770,33,27,A4,False,+34616413806
|
|
||||||
id_263,2024-01-08 17:57:00,ventas,voz,558,12,31,A5,False,+34661509503
|
|
||||||
id_264,2024-01-14 14:26:00,retenciones,chat,717,19,23,A4,False,+34698683379
|
|
||||||
id_265,2024-01-04 13:41:00,posventa,chat,443,42,38,A2,False,+34606739013
|
|
||||||
id_266,2024-01-24 10:36:00,ventas,chat,683,24,25,A4,False,+34648085527
|
|
||||||
id_267,2024-01-22 10:25:00,ventas,voz,316,0,17,A4,False,+34652496899
|
|
||||||
id_268,2024-01-29 10:23:00,posventa,voz,852,25,35,A5,False,+34692573559
|
|
||||||
id_269,2024-01-30 15:33:00,ventas,voz,921,61,25,A2,False,+34615663645
|
|
||||||
id_270,2024-01-26 13:52:00,retenciones,voz,677,31,62,A2,False,+34696432867
|
|
||||||
id_271,2024-01-30 14:48:00,ventas,email,431,27,47,A4,False,+34663848248
|
|
||||||
id_272,2024-01-28 13:44:00,soporte,email,326,39,23,A4,False,+34694499886
|
|
||||||
id_273,2024-01-27 13:46:00,posventa,chat,525,51,68,A3,False,+34679394364
|
|
||||||
id_274,2024-01-10 09:02:00,posventa,chat,908,19,51,A5,False,+34675057004
|
|
||||||
id_275,2024-01-19 12:18:00,ventas,email,506,0,47,A1,False,+34661069572
|
|
||||||
id_276,2024-01-04 13:25:00,soporte,email,493,34,34,A2,False,+34646206264
|
|
||||||
id_277,2024-01-04 13:40:00,retenciones,email,670,8,45,A1,False,+34682096675
|
|
||||||
id_278,2024-01-21 15:43:00,soporte,voz,485,10,25,A2,False,+34626133385
|
|
||||||
id_279,2024-01-16 13:30:00,ventas,voz,898,24,39,A1,True,+34600658003
|
|
||||||
id_280,2024-01-18 17:42:00,posventa,chat,450,32,23,A5,False,+34615433222
|
|
||||||
id_281,2024-01-06 09:31:00,posventa,chat,649,31,50,A1,True,+34653873131
|
|
||||||
id_282,2024-01-24 16:36:00,soporte,chat,619,7,48,A3,False,+34613981528
|
|
||||||
id_283,2024-01-21 19:56:00,posventa,voz,478,62,43,A2,False,+34650538135
|
|
||||||
id_284,2024-01-29 09:27:00,retenciones,email,481,24,42,A5,False,+34652777488
|
|
||||||
id_285,2024-01-02 13:45:00,soporte,chat,385,0,46,A1,False,+34623689071
|
|
||||||
id_286,2024-01-19 14:21:00,soporte,email,780,48,29,A2,False,+34652499002
|
|
||||||
id_287,2024-01-10 10:50:00,retenciones,voz,474,42,29,A1,False,+34628997485
|
|
||||||
id_288,2024-01-20 13:14:00,ventas,voz,497,36,36,A3,False,+34623593741
|
|
||||||
id_289,2024-01-27 16:39:00,retenciones,chat,776,28,37,A1,False,+34602276787
|
|
||||||
id_290,2024-01-23 16:58:00,posventa,email,1238,56,31,A3,False,+34669863927
|
|
||||||
id_291,2024-01-12 17:07:00,posventa,chat,783,16,68,A5,False,+34690067502
|
|
||||||
id_292,2024-01-15 15:17:00,posventa,chat,816,39,27,A1,False,+34618303750
|
|
||||||
id_293,2024-01-16 10:44:00,ventas,chat,546,39,31,A3,False,+34633833647
|
|
||||||
id_294,2024-01-11 12:03:00,retenciones,voz,496,12,57,A1,False,+34671335020
|
|
||||||
id_295,2024-01-23 12:20:00,soporte,email,415,53,27,A5,False,+34602592536
|
|
||||||
id_296,2024-01-20 09:25:00,ventas,email,672,33,34,A3,False,+34661963740
|
|
||||||
id_297,2024-01-09 11:37:00,ventas,voz,961,37,35,A4,False,+34693480811
|
|
||||||
id_298,2024-01-09 12:23:00,posventa,chat,208,55,39,A2,False,+34675211737
|
|
||||||
id_299,2024-01-16 12:27:00,posventa,email,486,21,30,A4,False,+34663349631
|
|
||||||
id_300,2024-01-22 08:04:00,ventas,chat,194,38,45,A3,False,+34605432019
|
|
||||||
|
@@ -1,12 +0,0 @@
|
|||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name _; # en local nos da igual el dominio
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://api:8000;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
44
docker-compose.yml
Normal file
44
docker-compose.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
version: "3.9"
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: ./backend
|
||||||
|
container_name: beyond-backend
|
||||||
|
environment:
|
||||||
|
# credenciales del API (las mismas que usas ahora)
|
||||||
|
BASIC_AUTH_USERNAME: admin
|
||||||
|
BASIC_AUTH_PASSWORD: admin
|
||||||
|
expose:
|
||||||
|
- "8000"
|
||||||
|
networks:
|
||||||
|
- beyond-net
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
build:
|
||||||
|
context: ./frontend
|
||||||
|
args:
|
||||||
|
# el front compilará con este BASE_URL -> /api
|
||||||
|
VITE_API_BASE_URL: /api
|
||||||
|
container_name: beyond-frontend
|
||||||
|
expose:
|
||||||
|
- "4173"
|
||||||
|
networks:
|
||||||
|
- beyond-net
|
||||||
|
|
||||||
|
nginx:
|
||||||
|
image: nginx:1.27-alpine
|
||||||
|
container_name: beyond-nginx
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
- frontend
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
volumes:
|
||||||
|
- ./nginx/conf.d:/etc/nginx/conf.d:ro
|
||||||
|
networks:
|
||||||
|
- beyond-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
beyond-net:
|
||||||
|
driver: bridge
|
||||||
3
frontend/.gitignore
vendored
3
frontend/.gitignore
vendored
@@ -10,7 +10,8 @@ lerna-debug.log*
|
|||||||
node_modules
|
node_modules
|
||||||
dist
|
dist
|
||||||
dist-ssr
|
dist-ssr
|
||||||
*.local
|
*.localnode_modules
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
# Editor directories and files
|
# Editor directories and files
|
||||||
.vscode/*
|
.vscode/*
|
||||||
|
|||||||
36
frontend/Dockerfile
Normal file
36
frontend/Dockerfile
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# frontend/Dockerfile
|
||||||
|
|
||||||
|
# 1) Fase de build
|
||||||
|
FROM node:20-alpine AS build
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copiamos sólo package.json para cachear mejor
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
# Copiamos el resto del código
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Variable para que el front apunte a nginx (/api -> backend)
|
||||||
|
ARG VITE_API_BASE_URL=/api
|
||||||
|
ENV VITE_API_BASE_URL=${VITE_API_BASE_URL}
|
||||||
|
|
||||||
|
# Construimos el bundle
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# 2) Fase de servidor estático
|
||||||
|
FROM node:20-alpine
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copiamos el build
|
||||||
|
COPY --from=build /app/dist ./dist
|
||||||
|
|
||||||
|
# Server estático muy simple
|
||||||
|
RUN npm install -g serve
|
||||||
|
|
||||||
|
EXPOSE 4173
|
||||||
|
|
||||||
|
CMD ["serve", "-s", "dist", "-l", "4173"]
|
||||||
5
frontend/dockerignore
Normal file
5
frontend/dockerignore
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
.vscode
|
||||||
|
.DS_Store
|
||||||
|
*.log
|
||||||
8
frontend/package-lock.json
generated
8
frontend/package-lock.json
generated
@@ -21,7 +21,7 @@
|
|||||||
"xlsx": "^0.18.5"
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22.14.0",
|
"@types/node": "^22.19.3",
|
||||||
"@vitejs/plugin-react": "^5.0.0",
|
"@vitejs/plugin-react": "^5.0.0",
|
||||||
"typescript": "~5.8.2",
|
"typescript": "~5.8.2",
|
||||||
"vite": "^6.2.0"
|
"vite": "^6.2.0"
|
||||||
@@ -1793,9 +1793,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "22.19.1",
|
"version": "22.19.3",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz",
|
||||||
"integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==",
|
"integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"xlsx": "^0.18.5"
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22.14.0",
|
"@types/node": "^22.19.3",
|
||||||
"@vitejs/plugin-react": "^5.0.0",
|
"@vitejs/plugin-react": "^5.0.0",
|
||||||
"typescript": "~5.8.2",
|
"typescript": "~5.8.2",
|
||||||
"vite": "^6.2.0"
|
"vite": "^6.2.0"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ type SegmentMapping = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const API_BASE_URL =
|
const API_BASE_URL =
|
||||||
import.meta.env.VITE_API_BASE_URL || 'http://localhost:8000';
|
import.meta.env.VITE_API_BASE_URL || '';
|
||||||
|
|
||||||
function getAuthHeader(): Record<string, string> {
|
function getAuthHeader(): Record<string, string> {
|
||||||
const user = import.meta.env.VITE_API_USERNAME;
|
const user = import.meta.env.VITE_API_USERNAME;
|
||||||
|
|||||||
261
install_beyond.sh
Normal file
261
install_beyond.sh
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# CONFIGURACIÓN BÁSICA – EDITA ESTO
|
||||||
|
###############################################
|
||||||
|
# TODO: pon aquí la URL real de tu repo
|
||||||
|
REPO_URL_DEFAULT="https://github.com/igferne/Beyond-Diagnosis.git"
|
||||||
|
INSTALL_DIR="/opt/beyonddiagnosis"
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# UTILIDADES
|
||||||
|
###############################################
|
||||||
|
step() {
|
||||||
|
echo
|
||||||
|
echo "=================================================="
|
||||||
|
echo " 👉 $1"
|
||||||
|
echo "=================================================="
|
||||||
|
}
|
||||||
|
|
||||||
|
require_root() {
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
echo "Este script debe ejecutarse como root (o con sudo)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 1. COMPROBACIONES INICIALES
|
||||||
|
###############################################
|
||||||
|
require_root
|
||||||
|
|
||||||
|
step "Recogiendo datos de configuración"
|
||||||
|
|
||||||
|
read -rp "Dominio para la aplicación (ej: app.cliente.com): " DOMAIN
|
||||||
|
if [ -z "$DOMAIN" ]; then
|
||||||
|
echo "El dominio no puede estar vacío."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -rp "Email para Let's Encrypt (avisos de renovación): " EMAIL
|
||||||
|
if [ -z "$EMAIL" ]; then
|
||||||
|
echo "El email no puede estar vacío."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -rp "Usuario de acceso (Basic Auth / login): " API_USER
|
||||||
|
if [ -z "$API_USER" ]; then
|
||||||
|
echo "El usuario no puede estar vacío."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -rsp "Contraseña de acceso: " API_PASS
|
||||||
|
echo
|
||||||
|
if [ -z "$API_PASS" ]; then
|
||||||
|
echo "La contraseña no puede estar vacía."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -rp "URL del repositorio Git [$REPO_URL_DEFAULT]: " REPO_URL
|
||||||
|
REPO_URL=${REPO_URL:-$REPO_URL_DEFAULT}
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Resumen de configuración:"
|
||||||
|
echo " Dominio: $DOMAIN"
|
||||||
|
echo " Email Let'sEnc: $EMAIL"
|
||||||
|
echo " Usuario API: $API_USER"
|
||||||
|
echo " Repo: $REPO_URL"
|
||||||
|
echo
|
||||||
|
|
||||||
|
read -rp "¿Continuar con la instalación? [s/N]: " CONFIRM
|
||||||
|
CONFIRM=${CONFIRM:-N}
|
||||||
|
if [[ ! "$CONFIRM" =~ ^[sS]$ ]]; then
|
||||||
|
echo "Instalación cancelada."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 2. INSTALAR DOCKER + DOCKER COMPOSE + CERTBOT
|
||||||
|
###############################################
|
||||||
|
step "Instalando Docker, docker compose plugin y certbot"
|
||||||
|
|
||||||
|
apt-get update -y
|
||||||
|
|
||||||
|
# Dependencias para repositorio Docker
|
||||||
|
apt-get install -y \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
gnupg \
|
||||||
|
lsb-release
|
||||||
|
|
||||||
|
# Clave GPG de Docker
|
||||||
|
if [ ! -f /etc/apt/keyrings/docker.gpg ]; then
|
||||||
|
install -m 0755 -d /etc/apt/keyrings
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
|
||||||
|
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Repo Docker estable
|
||||||
|
if [ ! -f /etc/apt/sources.list.d/docker.list ]; then
|
||||||
|
echo \
|
||||||
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
|
||||||
|
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
||||||
|
tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
apt-get update -y
|
||||||
|
|
||||||
|
apt-get install -y \
|
||||||
|
docker-ce \
|
||||||
|
docker-ce-cli \
|
||||||
|
containerd.io \
|
||||||
|
docker-buildx-plugin \
|
||||||
|
docker-compose-plugin \
|
||||||
|
git \
|
||||||
|
certbot
|
||||||
|
|
||||||
|
systemctl enable docker
|
||||||
|
systemctl start docker
|
||||||
|
|
||||||
|
# Abrimos puertos en ufw si está activo
|
||||||
|
if command -v ufw >/dev/null 2>&1; then
|
||||||
|
if ufw status | grep -q "Status: active"; then
|
||||||
|
step "Configurando firewall (ufw) para permitir 80 y 443"
|
||||||
|
ufw allow 80/tcp || true
|
||||||
|
ufw allow 443/tcp || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 3. CLONAR / ACTUALIZAR REPO
|
||||||
|
###############################################
|
||||||
|
step "Descargando/actualizando el repositorio en $INSTALL_DIR"
|
||||||
|
|
||||||
|
if [ -d "$INSTALL_DIR/.git" ]; then
|
||||||
|
echo "Directorio git ya existe, haciendo 'git pull'..."
|
||||||
|
git -C "$INSTALL_DIR" pull --ff-only
|
||||||
|
else
|
||||||
|
rm -rf "$INSTALL_DIR"
|
||||||
|
git clone "$REPO_URL" "$INSTALL_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$INSTALL_DIR"
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 4. CONFIGURAR docker-compose.yml (credenciales y nginx)
|
||||||
|
###############################################
|
||||||
|
step "Aplicando credenciales al docker-compose.yml"
|
||||||
|
|
||||||
|
if ! grep -q "BASIC_AUTH_USERNAME" docker-compose.yml; then
|
||||||
|
echo "⚠ No encuentro BASIC_AUTH_USERNAME en docker-compose.yml. Revisa el archivo a mano."
|
||||||
|
else
|
||||||
|
sed -i "s/BASIC_AUTH_USERNAME:.*/BASIC_AUTH_USERNAME: \"$API_USER\"/" docker-compose.yml
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q "BASIC_AUTH_PASSWORD" docker-compose.yml; then
|
||||||
|
echo "⚠ No encuentro BASIC_AUTH_PASSWORD en docker-compose.yml. Revisa el archivo a mano."
|
||||||
|
else
|
||||||
|
sed -i "s/BASIC_AUTH_PASSWORD:.*/BASIC_AUTH_PASSWORD: \"$API_PASS\"/" docker-compose.yml
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Aseguramos que nginx exponga también 443
|
||||||
|
if grep -q 'ports:' docker-compose.yml && grep -q 'nginx:' docker-compose.yml; then
|
||||||
|
if ! grep -q '443:443' docker-compose.yml; then
|
||||||
|
sed -i '/- "80:80"/a\ - "443:443"' docker-compose.yml || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Aseguramos que montamos /etc/letsencrypt dentro del contenedor de nginx
|
||||||
|
if ! grep -q '/etc/letsencrypt:/etc/letsencrypt:ro' docker-compose.yml; then
|
||||||
|
sed -i '/nginx:/,/networks:/{
|
||||||
|
/volumes:/a\ - /etc/letsencrypt:/etc/letsencrypt:ro
|
||||||
|
}' docker-compose.yml || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 5. OBTENER CERTIFICADO LET'S ENCRYPT
|
||||||
|
###############################################
|
||||||
|
step "Obteniendo certificado SSL de Let’s Encrypt para $DOMAIN"
|
||||||
|
|
||||||
|
if [ -f "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" ]; then
|
||||||
|
echo "Certificado ya existe, saltando paso de emisión."
|
||||||
|
else
|
||||||
|
# Asegurarnos de que no hay nada escuchando en 80/443
|
||||||
|
systemctl stop nginx || true
|
||||||
|
|
||||||
|
certbot certonly \
|
||||||
|
--standalone \
|
||||||
|
--non-interactive \
|
||||||
|
--agree-tos \
|
||||||
|
-m "$EMAIL" \
|
||||||
|
-d "$DOMAIN"
|
||||||
|
|
||||||
|
echo "Certificado emitido en /etc/letsencrypt/live/$DOMAIN/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 6. CONFIGURAR NGINX DENTRO DEL REPO
|
||||||
|
###############################################
|
||||||
|
step "Generando configuración nginx con SSL"
|
||||||
|
|
||||||
|
mkdir -p nginx/conf.d
|
||||||
|
|
||||||
|
cat > nginx/conf.d/beyond.conf <<EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
return 301 https://\$host\$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
|
||||||
|
# FRONTEND (React)
|
||||||
|
location / {
|
||||||
|
proxy_pass http://frontend:4173/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
# BACKEND (FastAPI)
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://backend:8000/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 7. BUILD Y ARRANQUE DE CONTENEDORES
|
||||||
|
###############################################
|
||||||
|
step "Construyendo imágenes Docker y arrancando contenedores"
|
||||||
|
|
||||||
|
docker compose build
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 8. FIN
|
||||||
|
###############################################
|
||||||
|
step "Instalación completada"
|
||||||
|
|
||||||
|
echo "La aplicación debería estar disponible en: https://$DOMAIN"
|
||||||
|
echo
|
||||||
|
echo "Servicios levantados:"
|
||||||
|
docker compose ps
|
||||||
|
echo
|
||||||
|
echo "Para ver logs: cd $INSTALL_DIR && docker compose logs -f"
|
||||||
|
echo "Para parar: cd $INSTALL_DIR && docker compose down"
|
||||||
27
nginx/conf.d/beyondcx-api.conf
Normal file
27
nginx/conf.d/beyondcx-api.conf
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
# FRONTEND (React)
|
||||||
|
location / {
|
||||||
|
proxy_pass http://frontend:4173/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
# API (backend FastAPI)
|
||||||
|
#
|
||||||
|
# El front llamará a /api/analysis, /api/auth/login, etc.
|
||||||
|
# Esto lo reenviamos al backend en 8000, eliminando el prefijo /api.
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://backend:8000/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user