We Build SG automatically curates a list of free public developer / design events from Facebook / Meetup / Eventbrite / ICS url / manual and open source projects from Github for the curious folks who love to make things in a particular city.
This repository is an example for Singapore.
-
clone this project and install dependancies:
git clone git@github.com:webuildsg/webuild.git && cd webuild gem install foreman thor tmuxinator gem install dotenv -v 0.11.1 gem install dotenv-deployment -v 0.0.2 npm install -g bower grunt-cli npm i && bower install
-
Setup environment variables. Refer Environment Variables section for more details.
cp .env.sample .env
-
Start the website locally with
./run.sh
Repositories curated automatically every hour:
- Github repositories
- user location contains
Singapore - repos with more than 50 watchers
- repos pushed date less than 3 months ago
- user location contains
Events curated automatically every hour:
- Facebook selected groups
- Meetup.com / Eventbrite event category
Technology, free, has a valid location - ICS url
- Manually added events
The events, repositories and podcasts data feeds are available in public as JSON format. Please refer to the list of API endpoints
A daily snapshot of the repos and events API V1 endpoints are stored in the archives for data analysis at data.webuild.sg.
You can deploy this app to 3 different platforms:
- Open Shift
- Heroku
- Bluemix
We are using Open Shift for production.
These are the steps for deploying:
-
create an application with folder
.openshiftwith various Open Shift related configurations -
install client tools with
gem install rhc -
setup the app with
rhc setup -
create an app using cartridge - note the
GIT_REMOTE_URL -
to ssh into your gear, use
rhc ssh {APP_NAME} -
add the cron cartridge with
rhc cartridge add cron -a {APP_NAME} -
set environment variables with
rhc env-set BOT_TOKEN={secret} EVENTBRITE_TOKEN={secret} GITHUB_CLIENT_ID={secret} GITHUB_CLIENT_SECRET={secret} MEETUP_API_KEY={secret} NODE_ENV={APP_NAME} TZ=Asia/Singapore WEBUILD_API_SECRET={secret} WEBUILD_AUTH0_CLIENT_ID={secret} WEBUILD_AUTH0_CLIENT_SECRET={secret} --app {APP_NAME} -
add a git remote to the git config, so you can push your code to the gear
[remote "{APP_NAME}"] url = {GIT_REMOTE_URL} fetch = +refs/heads/*:refs/remotes/{APP_NAME}/*
-
create a build file in path
.openshift/action_hooks/buildfor your app (if you're forking webuildsg, this is already inside the repo) -
make sure the build file permissions for is executable
chmod +x .openshift/action_hooks/build -
push the app
git push {APP_NAME} master --force -
check if the app website is up
-
if you need to restart the app use
rhc app-restart {APP_NAME} -
to see app info use
rhc app-show {APP_NAME} -v -
to check out the logs from the app use
rhc tail {APP_NAME}
These are the steps for deploying:
-
Install Heroku command line
-
Create new Heroku app for NodeJS
-
Setup the following environment variables under the Heroku app settings:
BOT_TOKEN=secret EVENTBRITE_TOKEN=secret GITHUB_CLIENT_ID=secret GITHUB_CLIENT_SECRET=secret MEETUP_API_KEY=secret NODE_ENV=production TZ=Asia/Singapore WEBUILD_API_SECRET=secret WEBUILD_AUTH0_CLIENT_ID=secret WEBUILD_AUTH0_CLIENT_SECRET=secret
-
Get Heroku Scheduler add on and add 2 tasks with an hourly frequency:
-
update events every hour
curl -X POST --data "secret=<WEBUILD_API_SECRET>" <your_production_url>/api/v1/events/update
-
update repos every hour
curl -X POST --data "secret=<WEBUILD_API_SECRET>" <your_production_url>/api/v1/repos/update
-
store to archives repos and events every day
curl -X POST --data "secret=<WEBUILD_API_SECRET>" <your_production_url>/api/v1/archives/update
-
These are the steps for deploying:
-
Install Cloud Foundry CLI
-
Create the manifest.yml file in the root directory. Modify the name, host and env for your application:
--- applications: - name: webuild host: webuild domain: mybluemix.net buildpack: sdk-for-nodejs command: node app.js path: . memory: 512M stack: cflinuxfs2 env: BOT_TOKEN: secret EVENTBRITE_TOKEN: secret GITHUB_CLIENT_ID: secret GITHUB_CLIENT_SECRET: secret MEETUP_API_KEY: secret NODE_ENV: production TZ: Asia/Singapore WEBUILD_API_SECRET: secret WEBUILD_AUTH0_CLIENT_ID: secret WEBUILD_AUTH0_CLIENT_SECRET: secret
-
Create the app on Bluemix
cf push
-
Setup the cron job with OpenWhisk (experimental): TODO
Set the following environment variables on your system:
- WEBUILD_API_SECRET (required) Used as a password when remotely refreshing the feeds.
- MEETUP_API_KEY (required) Used to list available meetup events in Singapore.
- EVENTBRITE_TOKEN (required) Used to list available eventbrite events in Singapore.
- WEBUILD_AUTH0_CLIENT_ID (required): Used to retrive facebook events in Singapore. Auth0 takes care of OAuth2 social logins.
- WEBUILD_AUTH0_CLIENT_SECRET (required): Same as above.
- PORT (optional, default: 4000) Configures the port used by the web server.
- LOCATION (optional, default: Singapore) The GitHub feed shows only repositories owned by developers in this area. Matches the GitHub "Location" property in user profiles.
- MAX_USERS (optional, default: 1000) Show only repositories belonging to developers in this ranking. Only the last updated repository of a user is shown.
- MAX_REPOS (optional, default: 50) Show up to this many total repositories.
- GITHUB_CLIENT_ID (optional) App OAuth client ID for GitHub.
- GITHUB_CLIENT_SECRET (optional) App OAuth client secret for GitHub.
- NODE_ENV Environment variable. By default it is
stagingand for production it isproduction - BOT_TOKEN This token is used by the We Build SG Bot to store the api endpoint responses for repos and events to the archives every day. Generate a token for the Github user We Build SG Bot.
Use an external "web cron" service to periodically refresh the GitHub data feed. Keep in mind that due to GitHub API rate limiting it may take >15 minutes to retrieve the entire feed. Register a GitHub OAuth application and configure the GITHUB_CLIENT_* environment variables (see above) to increase the rate limit. Do not refresh the feed too often or the rate limit will cause it to take longer.
Create an Auth0 account (you get one free app) and a Facebook app and link them with these instructions. Configure the WEBUILD_AUTH0_CLIENT_* environment variables (see above) and add your callback url in auth0. Run the app and if all is configured well, add your fb aceess token by logging in at <localhost>/admin
- Open a Firebase account
- Create a new app for this project
- Under
Login & Auth>Registered Users>Add User - Note the email, password, user uid and firebase unique app url for the following variables:
- FIREBASE_EMAIL (required): .
- FIREBASE_PASSWORD (required)
- FIREBASE_UID (required)
- FIREBASE_URL (required)
- Add events:
- Add manual events in file
config/whitelistEvents.json
- Add a Facebook groups with Facebook group ID in file
config/facebookGroups.json - Add an
*.icsformat URL in fileconfig/icsGroups.json
- Add manual events in file
- Remove events:
- Remove paid / duplicate events in file
config/blacklistEvents.json - Remove Meetup.com group by adding the
group_idin fileconfig/meetupBlacklistGroups.json
- Remove paid / duplicate events in file
- Cleanup old events manually in files
events/whitelistEvents.jsonandevents/blacklistEvents.jsonwithgrunt cleanup
Please see CONTRIBUTING.md for details.
Every production code has a version following the Semantic Versioning guidelines. Run the grunt bump, grunt bump:minor or grunt bump:major command to bump the version accordingly and then push to production with git push production master.
We Build is released under the MIT License.