106 lines
2.5 KiB
TypeScript
106 lines
2.5 KiB
TypeScript
/**
|
|
* Templates of the deployment procedure (procédure.md), used when a
|
|
* project is created from the dashboard.
|
|
*/
|
|
|
|
export type ProjectType = 'node' | 'adonis' | 'wordpress' | 'static'
|
|
|
|
const LOGGING = ` logging:
|
|
options:
|
|
max-size: "10m"
|
|
max-file: "3"`
|
|
|
|
const NETWORKS = `networks:
|
|
bdd_network:
|
|
external: true
|
|
caddy_network:
|
|
external: true`
|
|
|
|
function nodeService(service: string, name: string, port: number, command: string) {
|
|
return `services:
|
|
${service}:
|
|
image: node:22-alpine3.21
|
|
container_name: ${name}
|
|
working_dir: /app
|
|
volumes:
|
|
- ./project:/app
|
|
command: sh -c "${command.replace(/"/g, '\\"')}"
|
|
env_file: ./project/.env
|
|
environment:
|
|
- NODE_ENV=production
|
|
- HOST=0.0.0.0
|
|
- PORT=${port}
|
|
networks:
|
|
- bdd_network
|
|
- caddy_network
|
|
restart: unless-stopped
|
|
${LOGGING}
|
|
|
|
${NETWORKS}
|
|
`
|
|
}
|
|
|
|
export const DEFAULT_NODE_COMMAND = 'npm ci --omit=dev && node start.js'
|
|
|
|
export const ADONIS_COMMAND =
|
|
'npm ci --include=dev && node ace build && cd build && npm ci --omit=dev && node bin/server.js'
|
|
|
|
export function composeFile(
|
|
type: Exclude<ProjectType, 'static'>,
|
|
name: string,
|
|
port: number,
|
|
command?: string
|
|
) {
|
|
switch (type) {
|
|
case 'node':
|
|
return nodeService('nodejs', name, port, command || DEFAULT_NODE_COMMAND)
|
|
case 'adonis':
|
|
return nodeService('adonis', name, port, ADONIS_COMMAND)
|
|
case 'wordpress':
|
|
return `services:
|
|
wordpress:
|
|
image: wordpress:php8.5-apache
|
|
container_name: ${name}
|
|
restart: unless-stopped
|
|
environment:
|
|
WORDPRESS_DB_HOST: mariadb:3306
|
|
WORDPRESS_DB_NAME: \${WP_DB_NAME}
|
|
WORDPRESS_DB_USER: \${WP_DB_USER}
|
|
WORDPRESS_DB_PASSWORD: \${WP_DB_PASSWORD}
|
|
volumes:
|
|
- ./wp_data:/var/www/html
|
|
networks:
|
|
- caddy_network
|
|
- bdd_network
|
|
${LOGGING}
|
|
|
|
${NETWORKS}
|
|
`
|
|
}
|
|
}
|
|
|
|
export function proxyBlock(domain: string, upstream: string) {
|
|
return `${domain} {
|
|
\treverse_proxy ${upstream}
|
|
}`
|
|
}
|
|
|
|
export function staticBlock(domain: string, root: string, spa: boolean) {
|
|
return `${domain} {
|
|
\troot * ${root}
|
|
\tencode gzip
|
|
\tfile_server${spa ? '\n\ttry_files {path} /index.html' : ''}
|
|
}`
|
|
}
|
|
|
|
export function placeholderPage(name: string) {
|
|
return `<!doctype html>
|
|
<html lang="fr">
|
|
<head><meta charset="utf-8"><title>${name}</title></head>
|
|
<body style="font-family: system-ui, sans-serif; display: grid; place-items: center; min-height: 100vh; margin: 0">
|
|
<p>${name} : site en cours de déploiement.</p>
|
|
</body>
|
|
</html>
|
|
`
|
|
}
|