rspace-online/modules/forum/lib/cloud-init.ts

82 lines
1.9 KiB
TypeScript

/**
* Cloud-init user data generator for Discourse instances.
*/
export interface DiscourseConfig {
hostname: string;
adminEmail: string;
smtpHost?: string;
smtpPort?: number;
smtpUser?: string;
smtpPassword?: string;
}
export function generateCloudInit(config: DiscourseConfig): string {
const smtpHost = config.smtpHost || "mail.rmail.online";
const smtpPort = config.smtpPort || 587;
const smtpUser = config.smtpUser || `noreply@rforum.online`;
const smtpPassword = config.smtpPassword || "";
return `#!/bin/bash
set -e
# Swap
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# Install Docker
apt-get update
apt-get install -y git docker.io docker-compose
systemctl enable docker
systemctl start docker
# Clone Discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
# Write app.yml
cat > containers/app.yml << 'APPYML'
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ssl.template.yml"
- "templates/web.letsencrypt.ssl.template.yml"
expose:
- "80:80"
- "443:443"
params:
db_default_text_search_config: "pg_catalog.english"
env:
LANG: en_US.UTF-8
DISCOURSE_DEFAULT_LOCALE: en
DISCOURSE_HOSTNAME: '${config.hostname}'
DISCOURSE_DEVELOPER_EMAILS: '${config.adminEmail}'
DISCOURSE_SMTP_ADDRESS: '${smtpHost}'
DISCOURSE_SMTP_PORT: ${smtpPort}
DISCOURSE_SMTP_USER_NAME: '${smtpUser}'
DISCOURSE_SMTP_PASSWORD: '${smtpPassword}'
DISCOURSE_SMTP_ENABLE_START_TLS: true
LETSENCRYPT_ACCOUNT_EMAIL: '${config.adminEmail}'
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
APPYML
# Bootstrap and start
./launcher bootstrap app
./launcher start app
`;
}