diff --git a/.gitignore b/.gitignore index a521a8f..07c6f4e 100644 --- a/.gitignore +++ b/.gitignore @@ -109,4 +109,9 @@ public/*.js public/*.css public/*.map public/*.gz -docker-compose.yml \ No newline at end of file + +mysql/ +Dockerfile +docker-compose.yml +startup.sql + diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index cd1774f..0000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM node:15 - -# Change working directory -WORKDIR "/app" - -# Copy package.json and package-lock.json -COPY package*.json ./ - -# Install npm production packages -RUN npm install - -COPY . /app - -EXPOSE 3000 - -USER node - -ENTRYPOINT ["npm", "start"] \ No newline at end of file diff --git a/configure-script.js b/configure-script.js index 9d44e3a..b5fa6a9 100644 --- a/configure-script.js +++ b/configure-script.js @@ -30,6 +30,7 @@ const question = (prompt, def) => { //news configuration const newsName = await question('News Name', 'news'); + const newsWebAddress = await question('News Web Address', 'news.example.com'); const newsDBUser = await question('News Database Username', newsName); const newsDBPass = await question('News Database Password', 'charizard'); const newsKey = await question('News Query Key', 'key'); @@ -58,7 +59,7 @@ services: - "traefik.http.services.${projectName}service.loadbalancer.server.port=3000" environment: - WEB_PROTOCOL=https - - WEB_ADDRESS=localhost + - WEB_ADDRESS=${projectWebAddress} - WEB_PORT=3000 - MAIL_SMTP=${projectMailSMTP} - MAIL_USERNAME=${projectMailUser} @@ -69,25 +70,26 @@ services: - DB_PASSWORD=${projectDBPass} - DB_TIMEZONE=${databaseTimeZone} - SESSION_SECRET=secret - - SESSION_ADMIN=adminsecret - - NEWS_URI=http://news:3100/news - - NEWS_KEY=${newsKey} + - SESSION_ADMIN=adminsecret + - NEWS_URI=http://${newsWebAddress}:3100/news + - NEWS_KEY=${newsKey} networks: - app-network depends_on: - database + - traefik - news: + ${newsName}: image: krgamestudios/news-server:v1.0.0 ports: - "3100:3100" labels: - "traefik.enable=true" - - "traefik.http.routers.newsrouter.rule=Host('${projectWebAddress}')" - - "traefik.http.routers.newsrouter.entrypoints=websecure" - - "traefik.http.routers.newsrouter.tls.certresolver=myresolver" - - "traefik.http.routers.newsrouter.service=newsservice@docker" - - "traefik.http.services.newsservice.loadbalancer.server.port=3100" + - "traefik.http.routers.${newsName}router.rule=Host('${newsWebAddress}')" + - "traefik.http.routers.${newsName}router.entrypoints=websecure" + - "traefik.http.routers.${newsName}router.tls.certresolver=myresolver" + - "traefik.http.routers.${newsName}router.service=newsservice@docker" + - "traefik.http.services.${newsName}service.loadbalancer.server.port=3100" environment: - WEB_PORT=3100 - DB_HOSTNAME=database @@ -101,6 +103,7 @@ services: - app-network depends_on: - database + - traefik #chat: # image: krgamestudios/chat-server @@ -126,7 +129,7 @@ services: - "--providers.docker.exposedbydefault=false" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.myresolver.acme.tlschallenge=true" - - "--certificatesresolvers.myresolver.acme.email=${supportEmail} + - "--certificatesresolvers.myresolver.acme.email=${supportEmail}" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" ports: - "80:80" @@ -142,107 +145,39 @@ networks: driver: bridge `; + const dockerfile = ` +FROM node:15 +WORKDIR "/app" +WORKDIR "/app" +COPY package*.json ./ +RUN npm install +RUN apt-get update +RUN apt-get install -y mariadb-client +COPY . /app +EXPOSE 3000 + + +ENTRYPOINT ["bash", "-c"] +CMD ["mysql --host=database --user=root --password=${databaseRootPassword} < ./startup.sql && npm start"] +`; + + const scriptfile = ` +CREATE DATABASE IF NOT EXISTS ${projectName}; +CREATE USER IF NOT EXISTS '${projectDBUser}'@'%' IDENTIFIED BY '${projectDBPass}'; +GRANT ALL PRIVILEGES ON ${projectName}.* TO '${projectDBUser}'@'%'; + +CREATE DATABASE IF NOT EXISTS ${newsName}; +CREATE USER IF NOT EXISTS '${newsDBUser}'@'%' IDENTIFIED BY '${newsDBPass}'; +GRANT ALL PRIVILEGES ON ${newsName}.* TO '${newsDBUser}'@'%'; + +FLUSH PRIVILEGES; +`; + fs.writeFileSync('docker-compose.yml', yml); + fs.writeFileSync('Dockerfile', dockerfile); + fs.writeFileSync('startup.sql', scriptfile); })() .then(() => rl.close()) .catch(e => console.error(e)) ; -/* Default below - -services: - template: - build: . - ports: - - "3000:3000" - labels: - - "traefik.enable=true" - - "traefik.http.routers.templaterouter.rule=Host('template.com')" - - "traefik.http.routers.templaterouter.entrypoints=websecure" - - "traefik.http.routers.templaterouter.tls.certresolver=myresolver" - - "traefik.http.routers.templaterouter.service=templateservice@docker" - - "traefik.http.services.templateservice.loadbalancer.server.port=3000" - environment: - - WEB_PROTOCOL=https - - WEB_ADDRESS=localhost - - WEB_PORT=3000 - - MAIL_SMTP=smtp.example.com - - MAIL_USERNAME=foobar@example.com - - MAIL_PASSWORD=foobar - - DB_HOSTNAME=database - - DB_DATABASE=template - - DB_USERNAME=template - - DB_PASSWORD=pikachu - - DB_TIMEZONE=Australia/Sydney - - SESSION_SECRET=secret - - SESSION_ADMIN=adminsecret - networks: - - app-network - depends_on: - - database - - news: - image: krgamestudios/news-server:v1.0.0 - ports: - - "3100:3100" - labels: - - "traefik.enable=true" - - "traefik.http.routers.newsrouter.rule=Host('template.com')" - - "traefik.http.routers.newsrouter.entrypoints=websecure" - - "traefik.http.routers.newsrouter.tls.certresolver=myresolver" - - "traefik.http.routers.newsrouter.service=newsservice@docker" - - "traefik.http.services.newsservice.loadbalancer.server.port=3100" - environment: - - WEB_PORT=3100 - - DB_HOSTNAME=database - - DB_DATABASE=news - - DB_USERNAME=news - - DB_PASSWORD=charizard - - DB_TIMEZONE=Australia/Sydney - - QUERY_LIMIT=10 - - QUERY_KEY=key - networks: - - app-network - depends_on: - - database - - #chat: - # image: krgamestudios/chat-server - # ports: - # - "3200:3200" - - database: - image: mariadb - restart: always - environment: - MYSQL_ROOT_PASSWORD: example - volumes: - - ./mysql:/var/lib/mysql - networks: - - app-network - - traefik: - image: "traefik:v2.4" - container_name: "traefik" - command: - - "--api.insecure=false" - - "--providers.docker=true" - - "--providers.docker.exposedbydefault=false" - - "--entrypoints.websecure.address=:443" - - "--certificatesresolvers.myresolver.acme.tlschallenge=true" - - "--certificatesresolvers.myresolver.acme.email=postmaster@example.com" - - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" - ports: - - "80:80" - - "443:443" - volumes: - - "./letsencrypt:/letsencrypt" - - "/var/run/docker.sock:/var/run/docker.sock:ro" - networks: - - app-network - -networks: - app-network: - driver: bridge - -*/ \ No newline at end of file diff --git a/server/server.js b/server/server.js index ad64948..c605530 100644 --- a/server/server.js +++ b/server/server.js @@ -26,11 +26,11 @@ app.use('/api/accounts', require('./accounts')); app.use('/api/admin', require('./admin')); //send static files -app.use('/', express.static(path.resolve(__dirname, 'public'))); +app.use('/', express.static(path.resolve(__dirname, '..', 'public'))); //fallback to the index file app.get('*', (req, res) => { - res.sendFile(path.resolve(__dirname, 'public' , 'index.html')); + res.sendFile(path.resolve(__dirname, '..', 'public' , 'index.html')); }); //startup diff --git a/webpack.config.js b/webpack.config.js index e0283b5..ee3fdce 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -42,8 +42,8 @@ module.exports = ({ production, analyzer }) => { plugins: [ new DefinePlugin({ 'process.env': { - 'NEWS_URI': production ? `${process.env.NEWS_KEY}` : '"http://dev-news.eggtrainer.com:3100/news"', - 'NEWS_KEY': production ? `${process.env.NEWS_KEY}` : 'key', + 'NEWS_URI': production ? `"${process.env.NEWS_URI}"` : '"http://dev-news.eggtrainer.com:3100/news"', + 'NEWS_KEY': production ? `"${process.env.NEWS_KEY}"` : '"key"', } }), new CleanWebpackPlugin({