Serve different app on particular subdomain in multi-tenant system - google-app-engine

I have built an flask app hosted in App Engine, have used wildcard subdomain mapping along with namespace support provided App Engine so that app will be served from any subdomain. Its all working fine.
Now, I want to make one of the subdomain, say admin.domain.com to handle some admin related activities. All other subdomain points to normal app.
When un-registered user visits company.domain.com, it should be redirected to admin.domain.com where he will register, once done he will go back automatically to company.domain.com.
How to map a admin app to particular subdomain? Is there anyway to do it using Flask or App Engine? If not possible, how to handle this scenario?
This is the first time I am building such a app.
Thanks..

I'm not sure about the semantics when you use the word 'app'. In strict GAE sense, an apps are completely separate, each with its own billing and datastore etc.
If you strictly want to have the admin app as a separate app, you can't use the wildcard subdomain mapping. You'd have to manually map each subdomain using the App Engine admin settings for mapping domains. You can map the admin.domain.com to your admin app, and manually map your other subdomains to the normal app.
If you're just talking about separate admin functionality that runs in the same app, and you're not strictly set on using admin.domain.com, the best way is probably to use the new modules functionality and create your 'admin' as a separate module and use dispatch.yaml to route to it:
https://developers.google.com/appengine/docs/python/modules/routing
Otherwise, Flask/GAE doesn't really provide any built in mechanism for this. You'd have to do something messy like check the URL in every request handler and act appropriately if it's admin.

Related

Google App Engine custom subdomain mapping for a specific version

By default, specific versions of an App Engine app are routed by URLs like https://[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com.
Is there any way to have something similar with a custom domain?
I currently have a subdomain mapping for my app configured with a CNAME DNS record pointing to ghs.googlehosted.com (my "naked" domain is not served by App Engine). This allows serving the default version of my app from that subdomain, but I also want to be able to test new versions of the app using my domain (for various reasons such as sharing cookies, etc.)
For example, let's say my domain is typeracer.com and my custom domain mapping in App Engine is data.typeracer.com: I want to be able to access a specific version of my app at a URL like https://[VERSION_ID].data.typeracer.com. Is there any way to do this?
I've looked at the App Engine docs for adding wildcard subdomain mappings and using a dispatch.yaml. However, it looks like that would work only for routing specific services, but not specific versions of the app.
No, what you ask for exactly is not possible as the mapping is a (sub)domain per GAE service one, you cannot select a certain version of a service in the custom domain settings screen.
Sounds like may be attempting to implement different environments (say staging) based on service versions, which has some disadvantage, see Continuous integration/deployment/delivery on Google App Engine, too risky?
If so you can try to implement them using different services instead, which:
would allow you to map one (sub)domain per environment
you'd avoid all drawbacks mentioned in the above-mentioned Q&A
The domain naming scheme you mentioned suggests variable nesting levels, which in itself can be problematic, see Sub domain not listed in Google App Engine while enabling SSL for custom domains. Maybe try something like https://data-[VERSION_ID].typeracer.com instead of https://[VERSION_ID].data.typeracer.com?

How does one google app engine app serve multiple domains?

Or can it be done?
For example, I want to help a few friends to setup their shopping cart websites. They have their website domain names already purchased. But I want to pay one google app engine application at www.mywebsite.com, and I want to "forward" their domain to www.mywebsite.com/friend1, www.mywebsite.com/friend2. In this way, I want their customers see their website which could be http://www.friend1.com, but they are actually served by one single app engine application.
In my application, I know how to get the path analyzed so I can go to datastore to serve diffrent pages, html. So the question is just how or can one google app engine be forwarded from different domains. Thanks!
I'm not quite sure what is your exact meaning of "forward", but I try to answer for different situations.
If you want the browser to keep displaying www.friend1.com all the way without ever showing www.mywebsite.com, you should have friend1.com setup as a Google App account, and add their domain into your application (just like you did for your own domain). This way, all traffic to www.friend1.com (or what ever subdomain they pick) goes to your appengine app. And your App should detect the domain of the http request and response accordingly.
If you just want a "redirect"... that means, user goes to www.friend1.com will have their browser auto goes to www.mywebsite.com/friend1 and displaying it in the URL bar , well, just setup one index.html page in www.friend1.com and add meta refresh header in the file. Or use any server side redirect method.

App Engine - Custom Domain pointing to subdomain

I hear that now we can do wildcard subdomains on google app engine (I haven't tried it myself, but I believe that's been a new feature added), but can we have a domain point to it?
So
new.example.com (works?)
newexample.com -> new.example.com (does this work? where newexample.com is acting as new.example.com)
The way I envision newexample.com, this would work as
newexample.com/blog in the url, but app engine would support it as new.example.com/blog
I guess I am trying to emphasize that I am NOT looking for domain fowarding where newexample.com just forwards users to new.example.com
Thanks!
UPDATE: To clarify, I wasn't meaning naked domain, but a url like this
www.newexample.com/blog can work as new.example.com/blog or perhaps even more clearly, new.example.appspot.com/blog
Yes you just have to use an asterix *.example.com when setting up your custom domain in google apps.
To serve your app on all subdomains within a given higher-level subdomain, you can use wildcard subdomain mapping: enter an asterisk in place of the lowest-level name. For example, entering * will cause your app to be served on all subdomains within your registered domain.
See Custom domains
*.yourappid.appspot.com domains work by default.
You can add your app to as many different Google Apps accounts (so can use multiple domains), but you can not use domain alias' within Google Apps, as only the primary domain from a google apps account is used.
Applications that use Google App Engine are not available for users at non-primary domains.
See Limitations for multiple domains
If the question is:
Can the "naked" domain such as newexample.com (i.e. without anything such as www. before it) be served by Google App Engine?
Then the answer is no - see the FAQ
Wildcard subdomains let you have any subdomain the a user enters (e.g. myphotos.example.com, yourphotos.example.com, etc...) be served by Google App Engine without having to set each one up individually. Although it does require a DNS provider that supports wildcards.

Redirecting domain (not google apps) to appengine

I'm building a application that supports different domains. A small CMS that supports different domains.
But what I can't figure out is how to redirect other domains that's outside google apps. I have a domain at google apps, that work's perfectly.
When I create a cname that points at either my appid.appspot.com or www.appsdomain.com it just goes to google.com.
What do I need to do so the other domains point to my appengine application.
..fredrik
You can't just use a cname because google needs to know how to direct the requests through their infrastructure to your app.
You should follow the instructions here: http://code.google.com/appengine/docs/domain.html to set up your name with their infrastructure so that requests to the cname get routed correctly.
Update: You do not have to move your domain to google, only inform them of the names you are going to set up cnames to point to them.
You can do that without a cname.
You need to set up a redirection mechanism of your second domain name. You can do that either by telling your registrar to redirect that url to your Google Apps url (that's how I do it with my registrar, name.com), or you could set up a small [php] script on a server you manage that would receive the queries on the second domain and issue a 301 redirect to your Google Apps domain.
EDIT: It all depends on what you want to do. If you want your app to live at both urls, then this solution will not work. I wrote this in the idea that you want the second url to redirect to your main url, if that's not what you want to do, then issuing redirects won't do the trick.

Google App Engine - one datastore for different domains and apps

Is that somehow possible to access one datastore? Or access one app from different domains.
App Engine recently add support for a feature called modules (Docs: go, python, java)
App Engine Modules (or just "Modules" hereafter) is a feature that lets developers factor large applications into logical components that can share stateful services and communicate in a secure fashion. An app that handles customer requests might include separate modules to handle other tasks:
API requests from mobile devices
Internal, admin-like requests
Backend processing such as billing pipelines and data analysis
When you create a new module, App Engine will create a url that corresponds to the module name. If you only have one module then the name will be default. e.g.
http://default.myapp.appspot.com
http://mobile‑frontend.myapp.appspot.com
http://my-module.myapp.appspot.com
Using Domain masking, you could then direct from:
www.myapp.com => http://default.myapp.appspot.com
www.myapp-mobile.com => http://mobile‑frontend.myapp.appspot.com
www.example.com => http://my-module.myapp.appspot.com
Every app has its own datastore and memcache (shared among all versions of that app).
It seems not possible to share datastores between applications right now (unless you provide some web service for that), but that would be a nice feature to have, so maybe you should file a feature request with Google vote for it.
As for domains, you can associate your app with domains managed by Google Apps. Multiple domains for the same application should be no problem (except for SSL certificates).
Every version of an app is backed by the same datastore. If you want to limit access for individual requests, you'll need to add a field to your model to enforce that restriction. There are low level hooks in the datastore API for this sort of thing, if you want to go that far.
And yes, you can add a single App Engine app to multiple domains - even in multiple Apps accounts.
Kyle's solution would work, but App Engine was never designed to be used in this way. So if you architect your app(s) to rely on this kind of setup and Google clamps down for whatever reason then you'd be screwed.
You can have multitenancy using the Namespace Java API

Resources