first commit

This commit is contained in:
debu-2 2026-10-03 21:14:44 +05:30
commit cce9a8c9ba
73 changed files with 8665 additions and 0 deletions

View file

@ -0,0 +1,678 @@
{
"AA": "#3E0C0C",
"AB": "#3F100C",
"AC": "#40150B",
"AD": "#41190B",
"AE": "#421E0B",
"AF": "#43230A",
"AG": "#44280A",
"AH": "#452E0A",
"AI": "#463409",
"AJ": "#473A09",
"AK": "#484008",
"AL": "#494708",
"AM": "#464908",
"AN": "#414A07",
"AO": "#3B4B07",
"AP": "#364C07",
"AQ": "#304E06",
"AR": "#2A4F06",
"AS": "#245005",
"AT": "#1E5105",
"AU": "#175204",
"AV": "#105304",
"AW": "#085404",
"AX": "#035505",
"AY": "#03560C",
"AZ": "#025713",
"BA": "#40180C",
"BB": "#401D0C",
"BC": "#41210B",
"BD": "#42260B",
"BE": "#432C0B",
"BF": "#44310A",
"BG": "#45370A",
"BH": "#463D0A",
"BI": "#474309",
"BJ": "#474809",
"BK": "#424909",
"BL": "#3D4A08",
"BM": "#384B08",
"BN": "#324C08",
"BO": "#2D4D07",
"BP": "#274E07",
"BQ": "#204F06",
"BR": "#1A5006",
"BS": "#135105",
"BT": "#0C5205",
"BU": "#055305",
"BV": "#04540B",
"BW": "#045512",
"BX": "#035619",
"BY": "#035820",
"BZ": "#025928",
"CA": "#41250C",
"CB": "#422A0C",
"CC": "#432F0C",
"CD": "#44340B",
"CE": "#453A0B",
"CF": "#46400B",
"CG": "#47460A",
"CH": "#43480A",
"CI": "#3E490A",
"CJ": "#394A09",
"CK": "#344B09",
"CL": "#2F4C08",
"CM": "#294D08",
"CN": "#234E08",
"CO": "#1D4F07",
"CP": "#175007",
"CQ": "#105106",
"CR": "#095206",
"CS": "#065309",
"CT": "#055410",
"CU": "#055517",
"CV": "#04561E",
"CW": "#045725",
"CX": "#03582D",
"CY": "#035935",
"CZ": "#025A3D",
"DA": "#42320D",
"DB": "#43370C",
"DC": "#443D0C",
"DD": "#45430C",
"DE": "#44460B",
"DF": "#3F470B",
"DG": "#3B480B",
"DH": "#36490A",
"DI": "#314A0A",
"DJ": "#2B4B09",
"DK": "#264C09",
"DL": "#204D09",
"DM": "#1A4E08",
"DN": "#134F08",
"DO": "#0D5007",
"DP": "#075108",
"DQ": "#07520E",
"DR": "#065315",
"DS": "#06541C",
"DT": "#055523",
"DU": "#05572A",
"DV": "#045832",
"DW": "#045939",
"DX": "#035A42",
"DY": "#035B4A",
"DZ": "#025C53",
"EA": "#44400D",
"EB": "#44450D",
"EC": "#40460C",
"ED": "#3C470C",
"EE": "#37480C",
"EF": "#32490B",
"EG": "#2D4A0B",
"EH": "#284B0A",
"EI": "#224C0A",
"EJ": "#1D4D0A",
"EK": "#174E09",
"EL": "#104F09",
"EM": "#0A5008",
"EN": "#08510D",
"EO": "#085213",
"EP": "#07531A",
"EQ": "#075420",
"ER": "#065527",
"ES": "#06562F",
"ET": "#055736",
"EU": "#05583E",
"EV": "#045946",
"EW": "#045A4E",
"EX": "#035B57",
"EY": "#03595D",
"EZ": "#02525E",
"FA": "#3D450D",
"FB": "#38460D",
"FC": "#34470D",
"FD": "#2F480C",
"FE": "#2A490C",
"FF": "#254A0B",
"FG": "#1F4B0B",
"FH": "#1A4C0B",
"FI": "#144D0A",
"FJ": "#0D4E0A",
"FK": "#094F0C",
"FL": "#095012",
"FM": "#095118",
"FN": "#08521E",
"FO": "#085325",
"FP": "#07542C",
"FQ": "#075633",
"FR": "#06573B",
"FS": "#065842",
"FT": "#05594A",
"FU": "#055A53",
"FV": "#045A5B",
"FW": "#04545C",
"FX": "#034D5D",
"FY": "#03465E",
"FZ": "#023E5F",
"GA": "#31470D",
"GB": "#2C480D",
"GC": "#27490D",
"GD": "#224A0C",
"GE": "#1D4B0C",
"GF": "#174C0C",
"GG": "#114D0B",
"GH": "#0B4E0B",
"GI": "#0A4F11",
"GJ": "#0A5016",
"GK": "#0A511D",
"GL": "#095223",
"GM": "#09532A",
"GN": "#085430",
"GO": "#085538",
"GP": "#07563F",
"GQ": "#075747",
"GR": "#06584F",
"GS": "#065957",
"GT": "#06555A",
"GU": "#054F5B",
"GV": "#05485D",
"GW": "#04415E",
"GX": "#04395F",
"GY": "#033160",
"GZ": "#022961",
"HA": "#24480E",
"HB": "#1F490D",
"HC": "#1A4A0D",
"HD": "#144B0D",
"HE": "#0E4C0C",
"HF": "#0C4D10",
"HG": "#0B4E15",
"HH": "#0B4F1B",
"HI": "#0B5021",
"HJ": "#0A5127",
"HK": "#0A522E",
"HL": "#095335",
"HM": "#09543C",
"HN": "#085643",
"HO": "#08574B",
"HP": "#085853",
"HQ": "#075759",
"HR": "#07505A",
"HS": "#064A5B",
"HT": "#06435C",
"HU": "#053C5D",
"HV": "#05345E",
"HW": "#042D5F",
"HX": "#042560",
"HY": "#031C62",
"HZ": "#031463",
"IA": "#174A0E",
"IB": "#124B0E",
"IC": "#0D4C0F",
"ID": "#0D4D14",
"IE": "#0C4E19",
"IF": "#0C4F1F",
"IG": "#0C5025",
"IH": "#0B512B",
"II": "#0B5232",
"IJ": "#0A5339",
"IK": "#0A5440",
"IL": "#0A5547",
"IM": "#09564F",
"IN": "#095756",
"IO": "#085258",
"IP": "#084C59",
"IQ": "#07455A",
"IR": "#073E5B",
"IS": "#06375D",
"IT": "#06305E",
"IU": "#05285F",
"IV": "#052060",
"IW": "#041861",
"IX": "#041062",
"IY": "#030763",
"IZ": "#070364",
"JA": "#0E4B13",
"JB": "#0E4C18",
"JC": "#0E4D1E",
"JD": "#0D4E23",
"JE": "#0D4F29",
"JF": "#0C502F",
"JG": "#0C5136",
"JH": "#0B523D",
"JI": "#0B5344",
"JJ": "#0B544B",
"JK": "#0A5552",
"JL": "#0A5357",
"JM": "#094D58",
"JN": "#094759",
"JO": "#08405A",
"JP": "#083A5B",
"JQ": "#07335C",
"JR": "#072B5D",
"JS": "#06245E",
"JT": "#061C5F",
"JU": "#051460",
"JV": "#050B62",
"JW": "#060463",
"JX": "#0E0464",
"JY": "#160365",
"JZ": "#1F0366",
"KA": "#0F4D22",
"KB": "#0E4E27",
"KC": "#0E4F2D",
"KD": "#0D5033",
"KE": "#0D513A",
"KF": "#0D5240",
"KG": "#0C5347",
"KH": "#0C544E",
"KI": "#0B5455",
"KJ": "#0B4E56",
"KK": "#0A4957",
"KL": "#0A4258",
"KM": "#093C59",
"KN": "#09355A",
"KO": "#082E5B",
"KP": "#08275C",
"KQ": "#07205E",
"KR": "#07185F",
"KS": "#061060",
"KT": "#060761",
"KU": "#0C0562",
"KV": "#140563",
"KW": "#1C0464",
"KX": "#250465",
"KY": "#2D0367",
"KZ": "#360368",
"LA": "#0F4E31",
"LB": "#0E4F37",
"LC": "#0E503D",
"LD": "#0E5144",
"LE": "#0D524B",
"LF": "#0D5352",
"LG": "#0C4F54",
"LH": "#0C4A55",
"LI": "#0B4456",
"LJ": "#0B3E58",
"LK": "#0B3859",
"LL": "#0A315A",
"LM": "#0A2A5B",
"LN": "#09235C",
"LO": "#091C5D",
"LP": "#08145E",
"LQ": "#080C5F",
"LR": "#0A0760",
"LS": "#120761",
"LT": "#1A0663",
"LU": "#220564",
"LV": "#2A0565",
"LW": "#330466",
"LX": "#3C0467",
"LY": "#450368",
"LZ": "#4F0369",
"MA": "#0F5041",
"MB": "#0F5147",
"MC": "#0E524E",
"MD": "#0E5053",
"ME": "#0D4B54",
"MF": "#0D4655",
"MG": "#0D4056",
"MH": "#0C3A57",
"MI": "#0C3458",
"MJ": "#0B2D59",
"MK": "#0B265A",
"ML": "#0A1F5B",
"MM": "#0A185C",
"MN": "#09105D",
"MO": "#09095F",
"MP": "#100860",
"MQ": "#180861",
"MR": "#1F0762",
"MS": "#280763",
"MT": "#300664",
"MU": "#390665",
"MV": "#410566",
"MW": "#4B0468",
"MX": "#540469",
"MY": "#5E036A",
"MZ": "#68036B",
"NA": "#0F5151",
"NB": "#0F4C52",
"NC": "#0F4753",
"ND": "#0E4254",
"NE": "#0E3C55",
"NF": "#0D3656",
"NG": "#0D3057",
"NH": "#0C2958",
"NI": "#0C235A",
"NJ": "#0B1C5B",
"NK": "#0B145C",
"NL": "#0A0D5D",
"NM": "#0F0A5E",
"NN": "#16095F",
"NO": "#1D0960",
"NP": "#250861",
"NQ": "#2D0862",
"NR": "#350764",
"NS": "#3E0765",
"NT": "#470666",
"NU": "#500667",
"NV": "#590568",
"NW": "#630569",
"NX": "#6A0468",
"NY": "#6C0360",
"NZ": "#6D0357",
"OA": "#104353",
"OB": "#0F3E54",
"OC": "#0F3855",
"OD": "#0E3256",
"OE": "#0E2C57",
"OF": "#0D2658",
"OG": "#0D1F59",
"OH": "#0D185A",
"OI": "#0C115B",
"OJ": "#0D0C5C",
"OK": "#140B5D",
"OL": "#1B0B5E",
"OM": "#230A5F",
"ON": "#2A0A61",
"OO": "#320962",
"OP": "#3A0863",
"OQ": "#430864",
"OR": "#4C0765",
"OS": "#550766",
"OT": "#5E0667",
"OU": "#680669",
"OV": "#6A0562",
"OW": "#6B055A",
"OX": "#6C0451",
"OY": "#6D0349",
"OZ": "#6F0340",
"PA": "#103554",
"PB": "#102F55",
"PC": "#0F2956",
"PD": "#0F2357",
"PE": "#0E1C58",
"PF": "#0E1559",
"PG": "#0D0E5A",
"PH": "#130D5B",
"PI": "#1A0C5D",
"PJ": "#210C5E",
"PK": "#280B5F",
"PL": "#2F0B60",
"PM": "#370A61",
"PN": "#3F0A62",
"PO": "#480963",
"PP": "#510964",
"PQ": "#5A0866",
"PR": "#630867",
"PS": "#680763",
"PT": "#69065C",
"PU": "#6A0654",
"PV": "#6B054C",
"PW": "#6D0543",
"PX": "#6E043A",
"PY": "#6F0331",
"PZ": "#700327",
"QA": "#102655",
"QB": "#101F56",
"QC": "#0F1958",
"QD": "#0F1259",
"QE": "#120E5A",
"QF": "#180E5B",
"QG": "#1F0D5C",
"QH": "#260D5D",
"QI": "#2D0C5E",
"QJ": "#340C5F",
"QK": "#3C0B60",
"QL": "#440B61",
"QM": "#4D0A63",
"QN": "#550A64",
"QO": "#5E0965",
"QP": "#660965",
"QQ": "#67085D",
"QR": "#680856",
"QS": "#6A074E",
"QT": "#6B0646",
"QU": "#6C063D",
"QV": "#6D0535",
"QW": "#6E052C",
"QX": "#700422",
"QY": "#710419",
"QZ": "#72030E",
"RA": "#111657",
"RB": "#111058",
"RC": "#171059",
"RD": "#1D0F5A",
"RE": "#240F5B",
"RF": "#2B0E5C",
"RG": "#320E5D",
"RH": "#390D5F",
"RI": "#410D60",
"RJ": "#490C61",
"RK": "#510C62",
"RL": "#5A0B63",
"RM": "#620B64",
"RN": "#650A5F",
"RO": "#660958",
"RP": "#680950",
"RQ": "#690849",
"RR": "#6A0841",
"RS": "#6B0738",
"RT": "#6C0730",
"RU": "#6E0627",
"RV": "#6F051D",
"RW": "#700514",
"RX": "#71040A",
"RY": "#720804",
"RZ": "#741103",
"SA": "#1C1158",
"SB": "#221059",
"SC": "#29105B",
"SD": "#2F0F5C",
"SE": "#360F5D",
"SF": "#3E0E5E",
"SG": "#450E5F",
"SH": "#4D0D60",
"SI": "#550D61",
"SJ": "#5E0C62",
"SK": "#630C60",
"SL": "#650B5A",
"SM": "#660B52",
"SN": "#670A4B",
"SO": "#680A43",
"SP": "#69093B",
"SQ": "#6A0833",
"SR": "#6C082B",
"SS": "#6D0722",
"ST": "#6E0718",
"SU": "#6F060F",
"SV": "#700605",
"SW": "#720F05",
"SX": "#470F03",
"SY": "#481502",
"SZ": "#491B02",
"TA": "#2D115A",
"TB": "#34115B",
"TC": "#3B105C",
"TD": "#42105D",
"TE": "#490F5E",
"TF": "#510F5F",
"TG": "#590E60",
"TH": "#620E61",
"TI": "#630D5B",
"TJ": "#640D54",
"TK": "#650C4D",
"TL": "#660B46",
"TM": "#670B3E",
"TN": "#680A37",
"TO": "#6A0A2E",
"TP": "#6B0926",
"TQ": "#6C091D",
"TR": "#6D0814",
"TS": "#6E070A",
"TT": "#700D07",
"TU": "#460E04",
"TV": "#471303",
"TW": "#481903",
"TX": "#492003",
"TY": "#4A2602",
"TZ": "#4B2D02",
"UA": "#3F115B",
"UB": "#46115C",
"UC": "#4D105D",
"UD": "#55105F",
"UE": "#5D0F60",
"UF": "#610F5C",
"UG": "#620E56",
"UH": "#630E4F",
"UI": "#640D48",
"UJ": "#650D41",
"UK": "#670C3A",
"UL": "#680C32",
"UM": "#690B2A",
"UN": "#6A0A21",
"UO": "#6B0A19",
"UP": "#6C090F",
"UQ": "#6E0B09",
"UR": "#6F1408",
"US": "#461205",
"UT": "#471804",
"UU": "#481E04",
"UV": "#492404",
"UW": "#4A2A03",
"UX": "#4B3103",
"UY": "#4C3802",
"UZ": "#4D3F02",
"VA": "#51125D",
"VB": "#59115E",
"VC": "#5F115D",
"VD": "#601057",
"VE": "#611051",
"VF": "#620F4A",
"VG": "#630F44",
"VH": "#650E3C",
"VI": "#660D35",
"VJ": "#670D2D",
"VK": "#680C25",
"VL": "#690C1D",
"VM": "#6A0B14",
"VN": "#6C0B0B",
"VO": "#6D120A",
"VP": "#451006",
"VQ": "#451606",
"VR": "#461C05",
"VS": "#472205",
"VT": "#482804",
"VU": "#492E04",
"VV": "#4A3504",
"VW": "#4B3C03",
"VX": "#4C4303",
"VY": "#4D4B02",
"VZ": "#4B4E02",
"WA": "#5E1258",
"WB": "#5F1152",
"WC": "#60114C",
"WD": "#621046",
"WE": "#63103F",
"WF": "#640F38",
"WG": "#650F31",
"WH": "#660E29",
"WI": "#670E21",
"WJ": "#680D19",
"WK": "#6A0D10",
"WL": "#6B100C",
"WM": "#430F07",
"WN": "#441407",
"WO": "#451A06",
"WP": "#462006",
"WQ": "#472606",
"WR": "#482C05",
"WS": "#493205",
"WT": "#4A3905",
"WU": "#4B4004",
"WV": "#4C4704",
"WW": "#4C4D03",
"WX": "#464E03",
"WY": "#404F02",
"WZ": "#3A5002",
"XA": "#601248",
"XB": "#611241",
"XC": "#62113B",
"XD": "#631134",
"XE": "#64102D",
"XF": "#651025",
"XG": "#660F1D",
"XH": "#680E15",
"XI": "#690F0E",
"XJ": "#420E08",
"XK": "#431308",
"XL": "#441808",
"XM": "#451E07",
"XN": "#462307",
"XO": "#472907",
"XP": "#482F06",
"XQ": "#493606",
"XR": "#4A3C05",
"XS": "#4B4305",
"XT": "#4C4A05",
"XU": "#484D04",
"XV": "#424E04",
"XW": "#3C4F03",
"XX": "#365003",
"XY": "#305103",
"XZ": "#295202",
"YA": "#611237",
"YB": "#621230",
"YC": "#631129",
"YD": "#651121",
"YE": "#66101A",
"YF": "#671012",
"YG": "#410D09",
"YH": "#421209",
"YI": "#431709",
"YJ": "#431C08",
"YK": "#442108",
"YL": "#452708",
"YM": "#462D07",
"YN": "#473307",
"YO": "#483907",
"YP": "#494006",
"YQ": "#4A4706",
"YR": "#494B06",
"YS": "#434C05",
"YT": "#3E4D05",
"YU": "#384E04",
"YV": "#324F04",
"YW": "#2C5003",
"YX": "#255103",
"YY": "#1E5203",
"YZ": "#175402",
"ZA": "#631325",
"ZB": "#64121E",
"ZC": "#651216",
"ZD": "#3F0C0B",
"ZE": "#40110A",
"ZF": "#41160A",
"ZG": "#421B0A",
"ZH": "#432009",
"ZI": "#442509",
"ZJ": "#452B09",
"ZK": "#463008",
"ZL": "#473608",
"ZM": "#483D08",
"ZN": "#494307",
"ZO": "#4A4A07",
"ZP": "#454B06",
"ZQ": "#3F4C06",
"ZR": "#3A4D06",
"ZS": "#344E05",
"ZT": "#2E4F05",
"ZU": "#285004",
"ZV": "#215104",
"ZW": "#1A5204",
"ZX": "#135303",
"ZY": "#0C5403",
"ZZ": "#045502"
}

View file

@ -0,0 +1,132 @@
# App stack: frontend, backend, PostgreSQL, MongoDB
# Included by root docker-compose.yml — deploy from the repository root.
services:
postgres:
image: postgres:17-alpine
container_name: agmail-postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB:-agmail_profiles}
POSTGRES_USER: ${POSTGRES_USER:-agmail}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-agmail_dev_password}
ports:
- "${POSTGRES_PORT:-5432}:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-agmail} -d ${POSTGRES_DB:-agmail_profiles}"]
interval: 5s
timeout: 5s
retries: 10
mongodb:
image: mongo:8
container_name: agmail-mongodb
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USER:-agmail}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD:-agmail_dev_password}
MONGO_INITDB_DATABASE: ${MONGO_DATABASE:-agmail_messages}
ports:
- "${MONGO_PORT:-27017}:27017"
volumes:
- mongo_data:/data/db
healthcheck:
test:
[
"CMD",
"mongosh",
"--quiet",
"--username",
"${MONGO_ROOT_USER:-agmail}",
"--password",
"${MONGO_ROOT_PASSWORD:-agmail_dev_password}",
"--authenticationDatabase",
"admin",
"--eval",
"db.adminCommand('ping')",
]
interval: 5s
timeout: 5s
retries: 10
backend:
build:
context: ../../backend
container_name: agmail-backend
restart: unless-stopped
environment:
DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-agmail}:${POSTGRES_PASSWORD:-agmail_dev_password}@postgres:5432/${POSTGRES_DB:-agmail_profiles}
MONGO_URL: mongodb://${MONGO_ROOT_USER:-agmail}:${MONGO_ROOT_PASSWORD:-agmail_dev_password}@mongodb:27017/?authSource=admin
MONGO_DATABASE: ${MONGO_DATABASE:-agmail_messages}
JWT_SECRET: ${JWT_SECRET:?Set JWT_SECRET to a long random value}
PLATFORM_DOMAIN: ${PLATFORM_DOMAIN:-getall.help}
PLATFORM_SPF_INCLUDE: ${PLATFORM_SPF_INCLUDE:-_spf.getall.help}
APP_PUBLIC_HOST: ${APP_PUBLIC_HOST:-email.getall.help}
DKIM_SELECTOR: ${DKIM_SELECTOR:-agmail}
SMTP_HOST: ${SMTP_HOST:-smtp}
SMTP_PORT: ${SMTP_PORT:-25}
SMTP_PUBLIC_HOST: ${SMTP_PUBLIC_HOST:-mail.getall.help}
SMTP_USERNAME: ${SMTP_USERNAME:-}
SMTP_PASSWORD: ${SMTP_PASSWORD:-}
SMTP_USE_TLS: ${SMTP_USE_TLS:-false}
SMTP_HEALTH_REQUIRED: ${SMTP_HEALTH_REQUIRED:-false}
INBOUND_SMTP_ENABLED: ${INBOUND_SMTP_ENABLED:-true}
INBOUND_SMTP_HOST: 0.0.0.0
INBOUND_SMTP_PORT: 2525
INBOUND_MAX_BYTES: ${INBOUND_MAX_BYTES:-26214400}
INBOUND_ALLOWED_CIDRS: ${INBOUND_ALLOWED_CIDRS:-["127.0.0.0/8","172.16.0.0/12"]}
GCS_RAW_MIME_BUCKET: ${GCS_RAW_MIME_BUCKET:-}
GCS_RAW_MIME_PREFIX: ${GCS_RAW_MIME_PREFIX:-raw}
GCS_PROJECT: ${GCS_PROJECT:-}
GOOGLE_APPLICATION_CREDENTIALS: /run/secrets/gcp_service_account
CORS_ORIGINS: ${CORS_ORIGINS:-["http://localhost:8080"]}
DNS_SETUP_USERNAME: ${DNS_SETUP_USERNAME:-smtp-credentia}
DNS_SETUP_PASSWORD: ${DNS_SETUP_PASSWORD:-Nishtha#01}
ports:
- "127.0.0.1:${BACKEND_PORT:-8000}:8000"
- "${INBOUND_SMTP_BIND_IP:-127.0.0.1}:${INBOUND_SMTP_PORT:-2525}:2525"
volumes:
- relay_domains_data:/data/relay_domains
secrets:
- gcp_service_account
depends_on:
postgres:
condition: service_healthy
mongodb:
condition: service_healthy
healthcheck:
test:
[
"CMD",
"python",
"-c",
"import urllib.request; urllib.request.urlopen('http://localhost:8000/health')",
]
interval: 10s
timeout: 5s
retries: 5
frontend:
build:
context: ../../frontend
container_name: agmail-frontend
restart: unless-stopped
expose:
- "80"
ports:
- "127.0.0.1:${FRONTEND_PORT:-8080}:80"
depends_on:
backend:
condition: service_healthy
volumes:
postgres_data:
mongo_data:
relay_domains_data:
secrets:
gcp_service_account:
# /dev/null keeps local startup working before real GCS credentials exist.
file: ${GCP_CREDENTIALS_FILE:-/dev/null}

12
deploy/caddy/Caddyfile Normal file
View file

@ -0,0 +1,12 @@
# Public HTTPS entrypoint for the Agmail web UI.
# APP_PUBLIC_HOST and CADDY_ACME_EMAIL are injected by docker compose.
{
email {$CADDY_ACME_EMAIL}
}
{$APP_PUBLIC_HOST} {
tls {$CADDY_ACME_EMAIL}
encode gzip zstd
reverse_proxy frontend:80
}

View file

@ -0,0 +1,28 @@
# Caddy reverse proxy — terminates TLS and forwards to the frontend container.
# Included by root docker-compose.yml on the AWS mail/app host.
services:
caddy:
image: caddy:2-alpine
container_name: agmail-caddy
restart: unless-stopped
ports:
- "${CADDY_HTTP_PORT:-80}:80"
- "${CADDY_HTTPS_PORT:-443}:443"
- "${CADDY_HTTPS_PORT:-443}:443/udp"
environment:
APP_PUBLIC_HOST: ${APP_PUBLIC_HOST:-email.getall.help}
CADDY_ACME_EMAIL: ${CADDY_ACME_EMAIL:?Set CADDY_ACME_EMAIL for Let's Encrypt}
env_file:
- ../../.env
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
frontend:
condition: service_started
volumes:
caddy_data:
caddy_config:

View file

@ -0,0 +1,43 @@
# Postfix — inbound (:25 from internet) + outbound (trusted Docker clients).
# Included by root docker-compose.yml on the same host as the app.
#
# Inbound: transport map → backend:2525
# Outbound: backend submits to smtp:25 (mynetworks)
services:
smtp:
build:
context: ../../smtp
container_name: agmail-smtp
restart: unless-stopped
hostname: ${MAIL_HOSTNAME:-mail.getall.help}
environment:
MAIL_HOSTNAME: ${MAIL_HOSTNAME:-mail.getall.help}
MAIL_DOMAIN: ${MAIL_DOMAIN:-getall.help}
INBOUND_DOMAINS: ${INBOUND_DOMAINS:-getall.help}
RELAY_DOMAINS_FILE: /data/relay_domains/domains.list
RELAY_DOMAINS_REFRESH: ${RELAY_DOMAINS_REFRESH:-60}
BACKEND_INGEST_HOST: ${BACKEND_INGEST_HOST:-backend}
BACKEND_INGEST_PORT: ${BACKEND_INGEST_PORT:-2525}
ports:
- "${SMTP_INBOUND_PORT:-25}:25"
volumes:
- smtp_queue:/var/spool/postfix
- relay_domains_data:/data/relay_domains
depends_on:
backend:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "postfix status >/dev/null 2>&1"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
volumes:
smtp_queue: