Support #718
Updated by Daniel Curtis over 8 years ago
{{>toc}} This is a guide on how I installed the Firefox Auth, Content, and Sync components to form the Firefox Accounts Server on FreeBSD 10. h2. Prepare the Environment * Make sure the system is up to date: <pre> pkg update && pkg upgrade -y </pre> * Install a few dependencies: <pre> pkg install portmaster sudo bash git gmp graphicsmagick redis gmake python2 py27-virtualenv sqlite py27-sqlite3 gcc48 scrypt </pre> * Install node4 and npm2 from ports: <pre> portmaster www/node4 www/npm2 </pre> * Install a couple node modules globally: <pre> npm install -g pm2 grunt </pre> * Add the Firefox Accounts user: <pre> mkdir -p /usr/local/www/fxa pw groupadd fxa pw adduser -n fxa -g fxa -d /usr/local/www/fxa -s /bin/sh -c "Firefox Accounts" chown fxa:fxa /usr/local/www/fxa </pre> h2. Memcached Server * Install memcached: <pre> pkg install memcached </pre> * Start and enable memcached at boot: <pre> echo 'memcached_enable="YES"' >> /etc/rc.conf service memcached start </pre> h2. MySQL Database * Install MariaDB: <pre> pkg install mariadb101-{client,server} </pre> * Start and enable MariaDB at boot: <pre> echo 'mysql_enable="YES"' >> /etc/rc.conf service mysql-server start </pre> * Secure the mysql installation: <pre> mysql_secure_installation </pre> * Log into the MySQL console: <pre> mysql -u root -p </pre> #* Create the *fxauser* user with the SuperSecretPassword password and the *fxadb* database: <pre> CREATE USER 'fxauser'@'localhost' IDENTIFIED BY 'SuperSecretPassword'; CREATE DATABASE IF NOT EXISTS `fxadb` CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON `fxadb`.* TO 'fxauser'@'localhost'; </pre> #* Create the *fxasyncuser* user with the SuperDuperPassword password and the *fxasyncdb* database: <pre> CREATE USER 'fxasyncuser'@'localhost' IDENTIFIED BY 'SuperDuperPassword'; CREATE DATABASE IF NOT EXISTS `fxasyncdb` CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON `fxasyncdb`.* TO 'fxasyncuser'@'localhost'; </pre> #* Create the *fxaprofileuser* user with the SuperSuperPassword password and the *fxaprofiledb* database: <pre> CREATE USER 'fxaoauthuser'@'localhost' IDENTIFIED BY 'SuperOauthPassword'; CREATE DATABASE IF NOT EXISTS `fxaoauthdb` CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON `fxaoauthdb`.* TO 'fxaoauthuser'@'localhost'; </pre> #* Create the *fxaprofileuser* user with the SuperSuperPassword password and the *fxaprofiledb* database: <pre> CREATE USER 'fxaprofileuser'@'localhost' IDENTIFIED BY 'SuperSuperPassword'; CREATE DATABASE IF NOT EXISTS `fxaprofiledb` CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON `fxaprofiledb`.* TO 'fxaprofileuser'@'localhost'; </pre> #* Exit the mysql console: <pre> flush privileges; exit </pre> h2. Install Accounts Server * Switch to the fxa directory: <pre> cd /usr/local/www/fxa </pre> * Download the firefox auth server from GitHub: <pre> sudo -u fxa git clone https://github.com/mozilla/fxa-auth-server.git cd fxa-auth-server </pre> * Install the auth server: <pre> sudo -u fxa npm install </pre> #* And test the auth server: <pre> sudo -u fxa npm start </pre> *NOTE*: Press Ctrl+C to stop the test server. * Create a dev database config file: <pre> sudo -u fxa vi node_modules/fxa-auth-db-mysql/config/dev.json </pre> #* And add the following: <pre> { "master": { "user": "fxauser", "password": "SuperSecretPassword", "database": "fxadb", "host": "localhost", "port": "3306" }, "slave": { "user": "fxauser", "password": "SuperSecretPassword", "database": "fxadb", "host": "localhost", "port": "3306" } } </pre> * Create a dev auth server config file: <pre> sudo -u fxa vi config/dev.json </pre> #* And override the default values provided in the index.js file: <pre> { "publicUrl": "https://api.accounts.example.com", "db": { "backend": "mysql" }, "contentServer": { "url": "https://accounts.example.com" }, "oauth": { "url": "https://oauth.accounts.example.com" } } </pre> * Start the server in dev MySQL store mode: <pre> sudo -u fxa npm run start-mysql </pre> *NOTE*: Press Ctrl+C to stop the test server. #* A persistent deployment will require pm2: <pre> sudo -u fxa pm2 start npm --name fxa-auth -- run start-mysql </pre> h3. Auth Server Init Script * Create a firefox auth server init script: <pre> vi /usr/local/etc/rc.d/fxa-auth </pre> #* and add the following <pre> #!/bin/sh # PROVIDE: fxa-auth # KEYWORD: shutdown . /etc/rc.subr name="fxa_auth" start_cmd="${name}_start" stop_cmd="${name}_stop" fxa_auth_start() { echo "Firefox auth server starting" su - fxa -c "cd /usr/local/www/fxa/fxa-auth-server; /usr/local/bin/pm2 start npm --name ${name} -- run start-mysql; exit" } fxa_auth_stop() { echo "Firefox auth server stopping" su - fxa -c "/usr/local/bin/pm2 delete stop ${name}; exit" } run_rc_command "$1" </pre> * And make it executable: <pre> chmod +x /usr/local/etc/rc.d/fxa-auth </pre> * Start and enable firefox auth server at boot <pre> echo 'fxa_auth_enable="YES"' >> /etc/rc.conf service fxa-auth start </pre> h2. Firefox Content Server * Switch to the fxa directory: <pre> cd /usr/local/www/fxa </pre> * Download the firefox content server from GitHub: <pre> sudo -u fxa git clone https://github.com/mozilla/fxa-content-server.git cd fxa-content-server </pre> * Generate a strong secret and copy the contents over to the secret parameter in the syncserver config: <pre> head -c 20 /dev/urandom | shasum db8a203aed5fe3e4594d4b75990acb76242efd35 - </pre> *NOTE*: Make sure to copy the output * Create local content server config file: <pre> sudo -u fxa vi server/config/local.json </pre> #* And modify the following values: <pre> { "public_url": "https://accounts.example.com", "fxaccount_url": "https://api.accounts.example.com", "oauth_client_id": "98e6508e88680e1a", "oauth_url": "https://oauth.accounts.example.com", "profile_url": "https://profile.accounts.example.com", "profile_images_url": "https://image.accounts.example.com", "sync_tokenserver_url": "https://sync.accounts.gnetsolutions.net/token", "client_sessions": { "cookie_name": "session", "secret": "8fe72cba641d5c4afbf54127a0fc7bb2cc6618d0", "duration": 86400000 }, "env": "development", "use_https": false, "static_max_age" : 0, "route_log_format": "dev_fxa", "logging": { "fmt": "pretty", "level": "debug" }, "static_directory": "app", "allowed_parent_origins": ["/"], ["http://127.0.0.1:8080"], "csp": { "enabled": true, "reportUri": "/_/csp-violation" } } </pre> * Install the content server: <pre> sudo -u fxa npm install </pre> * Test the content server: <pre> sudo -u fxa npm run start-remote </pre> *NOTE*: Press Ctrl+C to stop the test server. #* A persistent deployment will require pm2: <pre> sudo -u fxa pm2 start npm --name fxa-content -- run start-remote </pre> h3. Content Server Init Script * Create a firefox content server init script: <pre> vi /usr/local/etc/rc.d/fxa-content </pre> #* and add the following <pre> #!/bin/sh # PROVIDE: fxa-content # KEYWORD: shutdown . /etc/rc.subr name="fxa_content" start_cmd="${name}_start" stop_cmd="${name}_stop" fxa_content_start() { echo "Firefox content server starting" su - fxa -c "cd /usr/local/www/fxa/fxa-content-server; /usr/local/bin/pm2 start npm --name ${name} -- run start-remote; exit" } fxa_content_stop() { echo "Firefox content server stopping" su - fxa -c "/usr/local/bin/pm2 delete stop ${name}; exit" } run_rc_command "$1" </pre> * And make it executable: <pre> chmod +x /usr/local/etc/rc.d/fxa-content </pre> * Start and enable firefox content server at boot <pre> echo 'fxa_content_enable="YES"' >> /etc/rc.conf service fxa-content start </pre> h2. Install OAuth Server * Switch to the fxa directory: <pre> cd /usr/local/www/fxa </pre> * Download the firefox oauth server from GitHub: <pre> sudo -u fxa git clone https://github.com/mozilla/fxa-oauth-server.git cd fxa-oauth-server </pre> * Edit the development oauth server config: <pre> sudo -u fxa vi config/dev.json </pre> #* And modify the following parameters: <pre> "browserid": { "issuer": "api.accounts.example.com", ... }, "contentUrl": "http://accounts.example.com/oauth/", "db": { "driver": "mysql" }, "mysql": { "user": "fxaoauthuser", "password": "SuperOauthPassword", "database": "fxaoauthdb", "host": "localhost", "port": "3306" }, ... "redirectUri": "http://accounts.example.com/api/oauth", </pre> * Install the oauth server: <pre> sudo -u fxa npm install </pre> * Test the oauth server: <pre> sudo -u fxa npm start </pre> *NOTE*: Press Ctrl+C to stop the test server. h3. OAuth Server Init Script * Create a firefox oauth server init script: <pre> vi /usr/local/etc/rc.d/fxa-oauth </pre> #* and add the following <pre> #!/bin/sh # PROVIDE: fxa-oauth # KEYWORD: shutdown . /etc/rc.subr name="fxa_oauth" start_cmd="${name}_start" stop_cmd="${name}_stop" fxa_oauth_start() { echo "Firefox oauth server starting" su - fxa -c "cd /usr/local/www/fxa/fxa-oauth-server; /usr/local/bin/pm2 start npm --name ${name} -- start; exit" } fxa_oauth_stop() { echo "Firefox oauth server stopping" su - fxa -c "/usr/local/bin/pm2 delete stop ${name}; exit" } run_rc_command "$1" </pre> * And make it executable: <pre> chmod +x /usr/local/etc/rc.d/fxa-oauth </pre> * Start and enable firefox oauth server at boot <pre> echo 'fxa_oauth_enable="YES"' >> /etc/rc.conf service fxa-oauth start </pre> h2. Install Profile Server * Switch to the fxa directory: <pre> cd /usr/local/www/fxa </pre> * Download the firefox profile server from GitHub: <pre> sudo -u fxa git clone https://github.com/mozilla/fxa-profile-server.git cd fxa-profile-server </pre> * Edit the development profile server config: <pre> sudo -u fxa vi config/dev.json </pre> #* And adjust the following values: <pre> { "authServer": { "url": "https://api.accounts.example.com" }, "db": { "driver": "mysql" }, "logging": { "fmt": "pretty", "level": "all", "debug": true }, "img": { "driver": "local" }, "mysql": { "user": "fxaprofileuser", "password": "SuperSuperPassword", "database": "fxaprofiledb", "host": "localhost", "port": "3306" }, "oauth": { "url": "https://oauth.accounts.example.com/v1" }, "customsUrl": "none", "publicUrl": "https://profile.accounts.example.com" } </pre> * Install the profile server: <pre> sudo -u fxa npm install </pre> * Test the profile server: <pre> sudo -u fxa npm start </pre> *NOTE*: Press Ctrl+C to stop the test server. h3. Profile Server Init Script * Create a firefox profile server init script: <pre> vi /usr/local/etc/rc.d/fxa-profile </pre> #* and add the following <pre> #!/bin/sh # PROVIDE: fxa-profile # KEYWORD: shutdown . /etc/rc.subr name="fxa_profile" start_cmd="${name}_start" stop_cmd="${name}_stop" fxa_profile_start() { echo "Firefox profile server starting" su - fxa -c "cd /usr/local/www/fxa/fxa-profile-server; /usr/local/bin/pm2 start npm --name ${name} -- start; exit" } fxa_profile_stop() { echo "Firefox profile server stopping" su - fxa -c "/usr/local/bin/pm2 delete stop ${name}; exit" } run_rc_command "$1" </pre> * And make it executable: <pre> chmod +x /usr/local/etc/rc.d/fxa-profile </pre> * Start and enable firefox profile server at boot <pre> echo 'fxa_profile_enable="YES"' >> /etc/rc.conf service fxa-profile start </pre> h2. Firefox Sync Server * Switch to the fxa directory: <pre> cd /usr/local/www/fxa </pre> * Get the latest version of the syncserver: <pre> sudo -u fxa git clone https://github.com/mozilla-services/syncserver.git cd syncserver </pre> * Build the Sync Server: <pre> sudo -u fxa gmake build </pre> * Generate a strong secret and copy the contents over to the secret parameter in the syncserver config: <pre> head -c 20 /dev/urandom | shasum db8a203aed5fe3e4594d4b75990acb76242efd35 - </pre> *NOTE*: Make sure to copy the output * Edit the syncserver config file: <pre> sudo -u fxa vi syncserver.ini </pre> #* And modify the following values: <pre> [syncserver] public_url = https://sync.accounts.example.com/ sqluri = pymysql://fxasyncuser:SuperDuperPassword@localhost/fxasyncdb secret = e48ee2c1a880c31100b5e3217a438f6c2d115b04 </pre> * Test run the syncserver: <pre> sudo -u fxa gmake serve </pre> *NOTE*: Press Ctrl+C to stop the test server. h2. Nginx * Install nginx: <pre> pkg install nginx openssl </pre> * Generate dhparam file: <pre> openssl dhparam -out /usr/local/etc/nginx/dhparam.pem 4096 </pre> * Start and enable nginx at boot: <pre> echo 'nginx_enable="YES"' >> /etc/rc.conf service nginx start </pre> * Create a configuration directory to make managing individual server blocks easier <pre> mkdir /usr/local/etc/nginx/conf.d </pre> * Edit the main nginx config file: <pre> vi /usr/local/etc/nginx/nginx.conf </pre> #* And strip down the config file and add the include statement at the end to make it easier to handle various server blocks: <pre> load_module /usr/local/libexec/nginx/ngx_mail_module.so; load_module /usr/local/libexec/nginx/ngx_stream_module.so; worker_processes 1; error_log /var/log/nginx-error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include /usr/local/etc/nginx/conf.d/*.conf; } </pre> h3. uWSGI * Install uwsgi: <pre> pkg install uwsgi </pre> * Start and enable uwsgi at boot with additional arguments: <pre> echo 'uwsgi_enable="YES"' >> /etc/rc.conf echo 'uwsgi_flags="-M -L --manage-script-name --mount /=/usr/local/www/fxa/syncserver/syncserver.wsgi"' >> /etc/rc.conf service uwsgi start </pre> *NOTE*: Pay attention to the */=* preceding the actual path of the syncserver.wsgi file. h3. Syncserver Nginx Config * Add a *sync.accounts.example.com server block*: <pre> vi /usr/local/etc/nginx/conf.d/sync.accounts.example.com.conf </pre> #* Add the following: <pre> server { listen 80; # listen 443 ssl; 443; server_name sync.accounts.example.com; access_log /var/log/sync.accounts.example.com-access.log; error_log /var/log/sync.accounts.example.com-error.log; # ssl_certificate /usr/local/etc/letsencrypt/live/sync.accounts.example.com/fullchain.pem; # ssl_certificate_key /usr/local/etc/letsencrypt/live/sync.accounts.example.com/privkey.pem; # Configure Strong SSL # ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL'; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_session_cache builtin:1000 shared:SSL:10m; # ssl_stapling on; # ssl_stapling_verify on; # ssl_prefer_server_ciphers on; # ssl_dhparam /usr/local/etc/nginx/dhparam.pem; # add_header Strict-Transport-Security max-age=63072000; # add_header X-Frame-Options SAMEORIGIN; # add_header X-Content-Type-Options nosniff; location / { include uwsgi_params; uwsgi_pass unix:/tmp/uwsgi.sock; } ## Add well-know location and allow connections from the internet location ~ /.well-known { allow all; root /usr/local/www/nginx; } } </pre> h3. Content Server Nginx Config * Add a *accounts.example.com server block*: <pre> vi /usr/local/etc/nginx/conf.d/accounts.example.com.conf </pre> #* Add the following: <pre> server { listen 80; # listen 443 ssl; 443; server_name accounts.example.com; access_log /var/log/accounts.example.com-access.log; error_log /var/log/accounts.example.com-error.log; # ssl_certificate /usr/local/etc/letsencrypt/live/accounts.example.com/fullchain.pem; # ssl_certificate_key /usr/local/etc/letsencrypt/live/accounts.example.com/privkey.pem; # Configure Strong SSL # ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL'; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_session_cache builtin:1000 shared:SSL:10m; # ssl_stapling on; # ssl_stapling_verify on; # ssl_prefer_server_ciphers on; # ssl_dhparam /usr/local/etc/nginx/dhparam.pem; # add_header Strict-Transport-Security max-age=63072000; # add_header X-Frame-Options SAMEORIGIN; # add_header X-Content-Type-Options nosniff; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_read_timeout 120; proxy_connect_timeout 10; proxy_pass http://127.0.0.1:3030/; } ## Add well-know location and allow connections from the internet location ~ /.well-known { allow all; root /usr/local/www/nginx; } } </pre> h3. Auth Server Nginx Config * Add a *api.accounts.example.com server block*: <pre> vi /usr/local/etc/nginx/conf.d/api.accounts.example.com.conf </pre> #* Add the following: <pre> server { listen 80; # listen 443 ssl; 443; server_name api.accounts.example.com; access_log /var/log/api.accounts.example.com-access.log; error_log /var/log/api.accounts.example.com-error.log; # ssl_certificate /usr/local/etc/letsencrypt/live/api.accounts.example.com/fullchain.pem; # ssl_certificate_key /usr/local/etc/letsencrypt/live/api.accounts.example.com/privkey.pem; # Configure Strong SSL # ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL'; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_session_cache builtin:1000 shared:SSL:10m; # ssl_stapling on; # ssl_stapling_verify on; # ssl_prefer_server_ciphers on; # ssl_dhparam /usr/local/etc/nginx/dhparam.pem; # add_header Strict-Transport-Security max-age=63072000; # add_header X-Frame-Options SAMEORIGIN; # add_header X-Content-Type-Options nosniff; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_read_timeout 120; proxy_connect_timeout 10; proxy_pass http://127.0.0.1:9000/; } ## Add well-know location and allow connections from the internet location ~ /.well-known { allow all; root /usr/local/www/nginx; } } </pre> h3. OAuth Server Nginx Config * Add a *oauth.accounts.example.com server block*: <pre> vi /usr/local/etc/nginx/conf.d/oauth.accounts.example.com.conf </pre> #* Add the following: <pre> server { listen 80; listen 443 ssl; 443; # server_name oauth.accounts.example.com; access_log /var/log/oauth.accounts.example.com-access.log; error_log /var/log/oauth.accounts.example.com-error.log; # ssl_certificate /usr/local/etc/letsencrypt/live/oauth.accounts.example.com/fullchain.pem; # ssl_certificate_key /usr/local/etc/letsencrypt/live/oauth.accounts.example.com/privkey.pem; # Configure Strong SSL # ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL'; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_session_cache builtin:1000 shared:SSL:10m; # ssl_stapling on; # ssl_stapling_verify on; # ssl_prefer_server_ciphers on; # ssl_dhparam /usr/local/etc/nginx/dhparam.pem; # add_header Strict-Transport-Security max-age=63072000; # add_header X-Frame-Options SAMEORIGIN; # add_header X-Content-Type-Options nosniff; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_read_timeout 120; proxy_connect_timeout 10; proxy_pass http://127.0.0.1:9010/; } ## Add well-know location and allow connections from the internet location ~ /.well-known { allow all; root /usr/local/www/nginx; } } </pre> h3. Profile Server Nginx Config * Add a *profile.accounts.example.com server block*: <pre> vi /usr/local/etc/nginx/conf.d/profile.accounts.example.com.conf </pre> #* Add the following: <pre> server { listen 80; # listen 443 ssl; 443; server_name profile.accounts.example.com; access_log /var/log/profile.accounts.example.com-access.log; error_log /var/log/profile.accounts.example.com-error.log; # ssl_certificate /usr/local/etc/letsencrypt/live/profile.accounts.example.com/fullchain.pem; # ssl_certificate_key /usr/local/etc/letsencrypt/live/profile.accounts.example.com/privkey.pem; # Configure Strong SSL # ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL'; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_session_cache builtin:1000 shared:SSL:10m; # ssl_stapling on; # ssl_stapling_verify on; # ssl_prefer_server_ciphers on; # ssl_dhparam /usr/local/etc/nginx/dhparam.pem; # add_header Strict-Transport-Security max-age=63072000; # add_header X-Frame-Options SAMEORIGIN; # add_header X-Content-Type-Options nosniff; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_read_timeout 120; proxy_connect_timeout 10; proxy_pass http://127.0.0.1:1111/; } ## Add well-know location and allow connections from the internet location ~ /.well-known { allow all; root /usr/local/www/nginx; } } </pre> h3. Profile Image Server Nginx Config * Add a *image.accounts.example.com server block*: <pre> vi /usr/local/etc/nginx/conf.d/image.accounts.example.com.conf </pre> #* Add the following: <pre> server { listen 80; # listen 443 ssl; 443; server_name image.accounts.example.com; access_log /var/log/image.accounts.example.com-access.log; error_log /var/log/image.accounts.example.com-error.log; # ssl_certificate /usr/local/etc/letsencrypt/live/image.accounts.example.com/fullchain.pem; # ssl_certificate_key /usr/local/etc/letsencrypt/live/image.accounts.example.com/privkey.pem; # Configure Strong SSL # ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL'; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_session_cache builtin:1000 shared:SSL:10m; # ssl_stapling on; # ssl_stapling_verify on; # ssl_prefer_server_ciphers on; # ssl_dhparam /usr/local/etc/nginx/dhparam.pem; # add_header Strict-Transport-Security max-age=63072000; # add_header X-Frame-Options SAMEORIGIN; # add_header X-Content-Type-Options nosniff; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_read_timeout 120; proxy_connect_timeout 10; proxy_pass http://127.0.0.1:1112/; } ## Add well-know location and allow connections from the internet location ~ /.well-known { allow all; root /usr/local/www/nginx; } } </pre> * Restart nginx: <pre> service nginx restart </pre> h3. LetsEncrypt * Install letsencrypt: <pre> pkg install py27-certbot </pre> * Create a directory for letsencrypt site configs: <pre> mkdir /usr/local/etc/letsencrypt/config </pre> * Create the *content* server letsencrypt config: <pre> vi /usr/local/etc/nginx/config/accounts.example.com.conf </pre> #* And add the following: <pre> domains = accounts.example.com rsa-key-size = 4096 server = https://acme-v01.api.letsencrypt.org/directory email = bob@example.com text = True agree-tos authenticator = webroot webroot-path = /usr/local/www/nginx </pre> * Create the *content* server SSL key and certificate: <pre> certbot certonly -c /usr/local/etc/letsencrypt/config/accounts.example.com.conf </pre> * Create the *auth* server letsencrypt config: <pre> vi /usr/local/etc/nginx/config/api.accounts.example.com.conf </pre> #* And add the following: <pre> domains = api.accounts.example.com rsa-key-size = 4096 server = https://acme-v01.api.letsencrypt.org/directory email = bob@example.com text = True agree-tos authenticator = webroot webroot-path = /usr/local/www/nginx </pre> * Create the *auth* server SSL key and certificate: <pre> certbot certonly -c /usr/local/etc/letsencrypt/config/api.accounts.example.com.conf </pre> * Create the *oauth* server letsencrypt config: <pre> vi /usr/local/etc/nginx/config/oauth.accounts.example.com.conf </pre> #* And add the following: <pre> domains = oauth.accounts.example.com rsa-key-size = 4096 server = https://acme-v01.api.letsencrypt.org/directory email = bob@example.com text = True agree-tos authenticator = webroot webroot-path = /usr/local/www/nginx </pre> * Create the *oauth* server SSL key and certificate: <pre> certbot certonly -c /usr/local/etc/letsencrypt/config/oauth.accounts.example.com.conf </pre> * Create the *profile* server letsencrypt config: <pre> vi /usr/local/etc/nginx/config/profile.accounts.example.com.conf </pre> #* And add the following: <pre> domains = profile.accounts.example.com rsa-key-size = 4096 server = https://acme-v01.api.letsencrypt.org/directory email = bob@example.com text = True agree-tos authenticator = webroot webroot-path = /usr/local/www/nginx </pre> * Create the *profile* server SSL key and certificate: <pre> certbot certonly -c /usr/local/etc/letsencrypt/config/profile.accounts.example.com.conf </pre> * Create the *profile image* server letsencrypt config: <pre> vi /usr/local/etc/nginx/config/image.accounts.example.com.conf </pre> #* And add the following: <pre> domains = image.accounts.example.com rsa-key-size = 4096 server = https://acme-v01.api.letsencrypt.org/directory email = bob@example.com text = True agree-tos authenticator = webroot webroot-path = /usr/local/www/nginx </pre> * Create the *profile image* server SSL key and certificate: <pre> certbot certonly -c /usr/local/etc/letsencrypt/config/image.accounts.example.com.conf </pre> * Create the *sync* server letsencrypt config: <pre> vi /usr/local/etc/nginx/config/sync.accounts.example.com.conf </pre> #* And add the following: <pre> domains = sync.accounts.example.com rsa-key-size = 4096 server = https://acme-v01.api.letsencrypt.org/directory email = bob@example.com text = True agree-tos authenticator = webroot webroot-path = /usr/local/www/nginx </pre> * Create the *sync* server SSL key and certificate: <pre> certbot certonly -c /usr/local/etc/letsencrypt/config/sync.accounts.example.com.conf </pre> * Now edit each of the nginx server block configs and *remove* all the commented out SSL parameters. * Restart nginx: <pre> service nginx restart </pre> h2. Connect Firefox In desktop Firefox, enter “about:config” in the URL bar, search for items containing “fxaccounts”, and edit them to use your self-hosted URLs: * Use your auth-server URL to replace “api.accounts.firefox.com” in the following settings: *# identity.fxaccounts.auth.uri * Use your content-server URL to replace “accounts.firefox.com” in the following settings: *# identity.fxaccounts.remote.signin.uri *# identity.fxaccounts.remote.signup.uri *# identity.fxaccounts.remote.force_auth.uri *# identity.fxaccounts.settings.uri * Use your content-server URL to replace “accounts.firefox.com” in the following settings: *# identity.fxaccounts.remote.webchannel.uri *# webchannel.allowObject.urlWhitelist * Optionally, use your oauth- and profile-server URLs to replace “oauth.accounts.firefox.com" and "profile.accounts.firefox.com” in *# identity.fxaccounts.remote.profile.uri *# identity.fxaccounts.remote.oauth.uri * To configure desktop Firefox to talk to your new Sync server, go to “about:config”, search for “identity.sync.tokenserver.uri” and change its value to the URL of your server with a path of “token/1.0/sync/1.5”: *# identity.sync.tokenserver.uri: http://sync.example.com/token/1.0/sync/1.5 h2. Resources * https://docs.services.mozilla.com/howtos/run-fxa.html * https://docs.services.mozilla.com/howtos/run-sync-1.5.html * https://github.com/mozilla/fxa-auth-server/ * https://github.com/mozilla/fxa-content-server/ * https://github.com/mozilla/fxa-oauth-server/ * https://github.com/mozilla/fxa-profile-server/